2010-03-27 6 views
1
에서 정규식으로 HTML을 구문 분석하는 데 도움이 필요

내 캐릭터는 여기파이썬

mystring = "<tr><td><span class='para'><b>Total Amount : </b>INR (Indian Rupees) 
100.00</span></td></tr>" 

내 문제는 내가 검색하고 전체 양

test = re.search("(Indian Rupees)(\d{2})(?:\D|$)", mystring) 

를 얻을 수 있지만, 내 테스트 나에게 없음을주지해야된다. 어떻게 가치와 값은 10.00, 100.00, 1000.00

감사

답변

7

난 강력하게 대신 사용자 정의 정규 표현식, 이것에 대한 실제 HTML 파서를 사용하는 것이 좋습니다 수 있습니다 얻을 수 있습니다. 당신이 HTML 파서를 사용하여 더 나을 수 있습니다 -

from BeautifulSoup import BeautifulSoup 

str = r''' 
<tr><td><span class='para'><b>Total Amount : </b>INR (Indian Rupees) 100.00</span></td></tr> 
''' 

soup = BeautifulSoup(str) 

amount = soup.findAll('span', attrs={'class': 'para'}) 
amount_tokens = amount[0].text.split() 
print amount_tokens[-1] 
3

나는 두 번째 엘리의 응답 :

다음은 BeautifulSoup 라이브러리 예입니다.

개인적으로 나는 매우 HTML을 구문 분석 lxml 라이브러리를 추천 할 것입니다 : 이 http://lxml.de/

그것은 매우 빠르고 기능이 풍부한입니다.

from lxml.html import fromstring 

s = """ 
<tr><td><span class='para'><b>Total Amount : </b>INR (Indian Rupees) 
100.00</span></td></tr> 
""" 

doc = fromstring(s) 
for span in doc.cssselect('span.para'): 
    print span.text_content().split()[-1] 
+0

잘 형식화 된 HTML의 경우 lxml은 훌륭합니다. BeautifulSoup는 그렇지 않은 HTML과 함께 훌륭합니다. – vy32

+0

lxml은 완전한 "태그 수프"가 아니라면 깨진 HTML을 꽤 잘 다룰 수 있습니다. 물론 –

+1

@ vy32 lxml은 많은 것들에 대해 BS보다 잘 작동하며, BS의 파싱 (lxml을 통해)을 사용할 수 없습니다. html.soupparser'). HTML5 구문 분석 규칙을 사용하려면 html5lib ('lxml.html.html5parser')도 사용할 수 있습니다. 그래서 lxml을 사용하면 가장 많은 옵션을 제공하고 실제로 유지 관리됩니다. –

1

나는 파서 갈 수있는 좋은 방법입니다 동의하지만 정규식으로 작업을 수행하는 방법을 요구하기 때문에, 여기에 방법 :

mystring = """<tr><td><span class='para'><b>Total Amount : 
</b>INR (Indian Rupees) 100.00</span></td></tr>""" 

test = re.search("\(Indian Rupees\) ([^<]+)", mystring) 

는 그런 다음 번호를 얻을 수 있습니다 :

test.group(1) 
+1

http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/408925.aspx –

+1

@Devin Please 내 대답의 첫 줄을 읽으십시오. 나는 (HTML) 파서가 (다른 사람들에 의해 이미 게시 된) 갈 길을 가졌음에도 불구하고 그가 의도 한 방식으로 작동하도록 코드를 수정하는 방법을 보여 주었다. 다행히도, 묻는 사람은 적어도 나쁜 것은 아닌 정규식에 대해 조금 더 배웠다. 어쨌든 나는 당신의 제안 된 링크가 다소 부적절하고 조금 무례하다고 느꼈지만 고마워한다. 나는 당신의 요지를 얻었지만, 당신이 나의 요점을 얻길 바랍니다. –

+0

지식이 항상 좋은 것은 아닙니다. 교육 만하고 싶다면 가르치는 것이 훨씬 낫습니다. 예를 들어 파서가 옳은 이유를 설명하고 잘못 범하는 이유를 설명 할 수 있습니다. 그들은 작동하지 않습니다! 그들은 허약하며 근본적으로 HTML의 모든 기능을 처리 할 수 ​​없습니다. 대신 올바른 도구가 아닌 방법에 대한 하프 라인 토큰을 넣습니다. 하지만 당신은 이것을 확실하게 뒷받침하지 않았습니다. 비록 당신이 주장 하긴하지만, 당신은 나머지 포스트를 행동과 모순되는 부분 : 정규식 기반 솔루션으로 보냅니다. 잘못된 메시지를 보내고 잘못된 선택을 가능하게합니다. 그것은 잘못된 대답입니다. –