2011-10-03 3 views
0

좋아, 이건 약간의 고통입니다. 나는 파이썬으로 약간의 긁어 모으기를하고 있으며, 빈약하게 태그가 붙은 HTML의 몇 줄에서 주소를 얻으려고 노력하고있다. 다음 형식의 예는 다음과 같습니다정규 표현식을 사용하여 단락에서 주소를 가져옵니다.

256-555-5555<br/> 
1234 Fake Ave S<br/> 
Gotham (Lower Ward)<br/> 

내가 좋아하는 것 만 1234 Fake Ave S, Gotham를 검색 할 수 있습니다. 어떤 아이디어? 나는 밤새 정규식을하고 있었고 이제는 내 뇌가 부드럽다. ...

편집 : 어떻게 데이터가 도착할 것인가에 대한 가능한 시나리오에 대해 자세히 설명한다. 때로는 첫 번째 라인이있을 수도 있고 때로는 그렇지 않을 수도 있습니다. 제가 본 주소의 모든 주소에는 Ave, Way, St가 있습니다. 선택의 요소로 사용하지 않기를 바랄 것입니다. 항상 확신 할 수는 없으므로 항상 그렇게 될 것입니다. 내가 생각했던 어떤

  1. 가 마지막 줄 (그래서, 세 줄이 두 번째 줄이있는 경우에 2 일 모든 선택 것이었다 : 두 번째와 세 번째 라인은 alPhone (또는 가능한 이메일 또는 웹 사이트)입니다 전화 번호가 없을 때 첫 번째 줄은 두 개뿐입니다).
  2. 괄호 안의 마지막 행의 모든 ​​항목을 선택합니다.
  3. 두 번째 줄부터 마지막 ​​줄까지를 결합하고 둘 사이에 ","를 추가하십시오.

나는 HTML 코드를 얻기 위해 스 커터를 사용하고 있습니다. 주소는 모두 같은 div에 있으며, 정규 표현식을 사용하여 데이터를 적절한 섹션으로 나누고 싶습니다. 이제 어떻게하는지 알아낼 수 없습니다.

Edit2가 :

은 피르의 의견에 따라, 나는 내가 이미 전화 번호를 분리하는 표현을 만들어 절을 괄호 것을 언급해야한다.

전화 (또는 가능한 이메일 또는 웹 사이트) :

((1[-. ])?[0-9]{3}[-. ])?\(?([0-9]{3}[-. ][A?([0-9]{4})|([\w\.-][email protected][\w\.-]+)|(www.+)|([\w\.-]*(?:com|net|org|us)) 

괄호 :

\((.*?)\) 

나는 모든 것을 -하지만 -이 문을 구성 할 사람들을 사용하는 방법을 모르겠어요.

+0

어떻게 "주소"를 지정 하시겠습니까? 입력 및 출력 형식에 대한 자세한 설명을 제공하십시오. 그리고 HTML 파서를 고려하십시오. – Howard

+3

regexps를 건너 뛰고 beautifulsoup와 같은 적절한 html-parser로 이동하십시오. –

+0

실제로 Scraping을 사용하여 스크래핑을 수행합니다. 좀 더 자세히 설명 했어야하는데 설명을 업데이트했습니다. – alukach

답변

1

당신의 경우에 당신이 원하지 않는 무엇에 초점을 쉽게하는 것이 가능하다 : 괄호 안의

  • 모든

    • html 태그 (<br>)
    • 전화 번호

    각각은 간단한 정규 표현식과 쉽게 매칭 될 수 있으므로 나머지 부분 (아마 - 주소)을 쉽게 구성 할 수 있습니다.

  • +0

    이것은 좋은 생각입니다. 전화 번호와 괄호 모두에 대해 데이터를 분리하기 위해 이미 정규 표현식을 작성했다고 언급해야합니다. 내가 반영하도록 게시물을 업데이 트했습니다. – alukach

    0

    당신이 문제를 이해하는 한, 당신은 그것을 해결하기 위해 잘못된 길을 가고 있다고 생각합니다.

    정규 표현식은 미확인 텍스트 요소의 펄프와 혼란으로부터 관련 데이터를 추출 할 수있는 마법의 도구는 아닙니다. 이것은 가변 부분을 갖는 텍스트로부터 데이터를 추출 할 수있을뿐만 아니라 가변 부분이 국한 될 수있는 상대적으로 앵커로 작용하는 최소한의 안정된 구조를 추출 할 수있는 도구입니다.

    치료할 때, 가능한 한 전화 번호와 그 다음에 1/2 줄의 주소가 포함 된이 부분을 먼저 격리 시켰습니다. 그러나 정보를 잃어 버렸습니다. 이전과 이후는 정보를 고정시키는 것이므로이 정보를 삭제 한 후에 얻은 나머지 섹션에서 무언가를 찾으려고 시도하면 안됩니다.

    또한 전화 번호와 주소 만 잡기를 원하지 않습니다.이 섹션의 앞이나 뒤에있는 다른 정보를 추출 할 수 있습니다. 좋은 모양의 정규 표현식을 사용하면 한 번에 모든 조각을 캡처 할 수 있습니다.

    그래서, 필요한 모든 데이터를 잡기 위해 정확하고 쉬운 정규식 전략을 쓸 수 있도록 제한된 섹션 뒤에 충분한 문자와 충분한 문자가있는 텍스트를 더 많이 제공하십시오. triplee는 이미 당신에게 그것을 물었습니다. 그리고 당신은하지 않았습니다, 왜?

    1

    이 문자열에서 마지막 두 줄을 분리하려고 시도 : 괄호를 트리밍

    >>> s="""256-555-5555<br/> 
    ... 1234 Fake Ave S<br/> 
    ... Gotham (Lower Ward)<br/> 
    ... """ 
    >>> m = re.search(r'((?!</br>).*)<br/>\n((?!</br>).*)<br/>$)', s) 
    >>> print m.group(1) 
    1234 Fake Ave S 
    

    을 아마 최고의 오히려 더 정규 표현식을 복잡보다, 코드의 별도의 라인에 남아 있습니다.

    관련 문제