2011-05-16 4 views
0

여기에 구문 분석하려고하는 HTML이 있습니다.고유하지 않은 표의 html에서 문자열 검색

<TD>Serial Number</TD><TD>AB12345678</TD> 

데이터를 구문 분석하기 위해 정규 표현식을 사용하려고합니다. 내가 BeautifulSoup에 대해 들었지만, 같은 테이블 매개 변수를 사용하는 페이지에 약 50 개의 항목이 있으며 ID 번호가없는 항목은 없습니다. 고유 ID에 가장 가까운 식별자는 필요한 데이터 이전의 셀에있는 데이터입니다.

serialNumber = re.search("Serial Number</td><td>\n(.*?)</td>", source) 

원본은 단순히 urllib을 사용하여 움켜 잡은 페이지의 소스 코드입니다. 두 번째와 일련 번호 사이에 html에 새로운 줄이 있지만 중요한지 확실하지 않습니다.

+0

정규식은 전통적으로 HTML을 구문 분석에 대한 경솔한 솔루션입니다 정규식에 대한 자세한 설명을 찾을 수 있습니다. BeautifulSoup을 사용하고 있어야하며, 테이블로 내려 가면서 데이터를 가져 오는 경우에만 (조건). 그렇지 않으면 다음 테이블로 가십시오. 당신은 [scrapy] (http://scrapy.org/)를 시도하고 정규식과 비슷한 것을 일반적으로 포함하는 거미를 작성하는 데 사용할 수 있습니다 – inspectorG4dget

+2

필수 링크 : http://stackoverflow.com/questions/1732348/regex- match-open-tags-except-xhtml-self-contained-tags – Amadan

답변

2

대한 파싱하여 데이터 당신에게 좀 더 강력한 추출기를 제공 할 수 있습니다 :

from pyparsing import makeHTMLTags, Word, alphanums 

htmlfrag = """<blah></blah><TD>Serial Number</TD><TD> 
      AB12345678 
      </TD><stuff></stuff>""" 

td,tdEnd = makeHTMLTags("td") 

sernoFormat = (td + "Serial Number" + tdEnd + 
       td + Word(alphanums)('serialNumber') + tdEnd) 


for sernoData in sernoFormat.searchString(htmlfrag): 
    print sernoData.serialNumber 

인쇄 : 여분의 공백 폭포 곳에 대한 파싱 상관하지 않습니다

AB12345678 

참고하고, 또한 핸들 정의 된 태그, 태그 안의 공백, 대문자/소문자 태그 등의 예기치 않은 속성.

+0

파서를 사용하는 방법에 대한 예제를 제공하고 일반적인 "파서를 HTML 용으로 사용하라 !!!" – stema

0

대부분의 경우 html로 작업하는 것이 좋습니다 적절한 파서를 사용하지만 어떤 경우에는 정규 표현식을 사용하는 것이 문제가되지 않습니다. 나는 당신의 작업에 대해 충분히 그것이 좋은 해결책인지 판단하거나 @ 폴의 솔루션으로 이동하는 것이 좋습니다 경우에 모르겠지만, 나는 여기 당신의 정규식 해결하려고 :

serialNumber = re.search("Serial Number</td><td>(.*?)</td>", source, re.S | re.I) 

내가 \n 제거를 , 내 의견 (\ n, \ r, \ r \ n, ...?)이 어렵 기 때문에 대신 re.S (Dotall) 옵션을 사용했습니다.

줄 바꿈이있는 경우 캡처 그룹에 포함됩니다. 즉 결과에서 공백을 제거해야합니다.

정규 표현식의 또 다른 문제점은 문자열에 <TD>이지만, <td>을 검색합니다. 옵션은 re.I (IgnoreCase)입니다.

당신은 here on docs.python.org

관련 문제