2014-01-07 1 views
0

Python을 사용하여 HTML 소스에서 전화, 팩스 및 주소를 얻으려면 어떻게해야합니까? 변수로 설정해야합니다.HTML을 구문 분석하여 데이터를 변수로 설정

<h2>My name</h2> 
<img src="images/logos/" style="float:right" /> 
<p>Adress 37/41 Portbell</p> 
<p>P.O.Box 12339, Kampala</p> 
<p>Tel: +41 414220702</p> 
<p>Fax: +41 414220929</p> 

나는이 경우 :(에서 pyquery을 사용할 수 없습니다

+0

HTML이 항상 같은 방식으로 포맷된다는 것을 알고 계십니까? – senshin

+0

@senshin 예, 항상 같은 방식으로 서식을 지정합니다. – user3146138

답변

1

HTML 구문 분석에 대한 Beautiful Soup를 사용하여 해결 방법 :

from bs4 import BeautifulSoup 
import re 

html = ... # your html goes here 
soup = BeautifulSoup(html) 

telephone_p = soup.find_all(text=re.compile(r'Tel:')) 
telephone = telephone_p[0].replace('Tel:', '').strip() 
fax_p = soup.find_all(text=re.compile(r'Fax:')) 
fax = fax_p[0].replace('Fax:', '').strip() 
address_ps = soup.find_all('p')[:2] 
address = '\n'.join([p.text for p in address_ps]) 

print(telephone) 
print(fax) 
print(address) 

결과 :

+41 414220702 
+41 414220929 
Adress 37/41 Portbell 
P.O.Box 12339, Kampala 

대체 솔루션 , 스탠드 만 사용 라이브러리 :

import re 

html = ... # your html goes here 

telephone = re.search('Tel: ([+\d\s]+)', html).groups()[0] 
fax = re.search('Fax: ([+\d\s]+)', html).groups()[0] 
paragraphs = [line for line in html.split('\n') if line.startswith('<p>')] 
address = '\n'.join([p.replace('<p>', '').replace('</p>', '') 
        for p in paragraphs[0:2]]) 

print(telephone) 
print(fax) 
print(address) 

결과 : 위와 동일합니다.


이 솔루션은 깨지기 쉬운, 그리고 (아마도 장관으로) 중단 할 경우 HTML 변경의 형식입니다.

관련 문제