파이썬을 사용하여 HTML 파싱


185

파이썬 목록 / 사전 / 객체의 형태로 태그를 얻는 데 도움이되는 Python 용 HTML 파서 모듈을 찾고 있습니다.

양식의 문서가있는 경우 :

<html>
<head>Heading</head>
<body attr1='val1'>
    <div class='container'>
        <div id='class'>Something here</div>
        <div>Something else</div>
    </div>
</body>
</html>

그런 다음 HTML 태그의 이름이나 ID를 통해 중첩 태그에 액세스하는 방법을 제공하여 기본적으로 div태그에 class='container'포함 된 body태그 또는 그와 비슷한 내용으로 태그 의 내용 / 텍스트를 가져 오도록 요청할 수 있습니다 .

Firefox의 "요소 검사"기능 (HTML보기)을 사용했다면 모든 태그를 나무처럼 멋진 중첩 방식으로 제공한다는 것을 알게 될 것입니다.

내장 모듈을 선호하지만 너무 많이 요구할 수 있습니다.


나는 Stack Overflow에 대한 많은 질문과 인터넷상의 몇 가지 블로그를 겪었으며 대부분은 BeautifulSoup 또는 lxml 또는 HTMLParser를 제안하지만 이러한 기능 중 일부는 기능을 자세히 설명하지 않으며 어떤 것이 더 빠르고 더 효율적인지에 대한 토론으로 끝납니다.


2
다른 모든 응답자와 마찬가지로 BeautifulSoup을 사용하는 것이 좋습니다. 깨진 HTML 파일을 처리하는 데 실제로 우수하기 때문입니다.
파스칼 로진

답변:


195

그래서 body 태그 내에 class = 'container'가 포함 된 div 태그의 내용 / 텍스트를 가져 오도록 요청할 수 있습니다.

try: 
    from BeautifulSoup import BeautifulSoup
except ImportError:
    from bs4 import BeautifulSoup
html = #the HTML code you've written above
parsed_html = BeautifulSoup(html)
print(parsed_html.body.find('div', attrs={'class':'container'}).text)

성능 설명이 필요하지 않습니다. BeautifulSoup의 작동 방식을 읽으십시오. 그것 봐 공식 문서 .


2
parsed_html 객체는 정확히 무엇입니까?
ffledgling

1
parsed_html은 BeautifulSoup 객체입니다. "body"와 같은 "tricky"속성이 있다는 점을 제외하면 DOMElement 또는 DOMDocument처럼 생각합니다. 루트 요소의 본문 요소 (이 경우 html)
Aadaam

18
업데이트 : BeautifulSoup 4에서 수입 라인은 이제from bs4 import BeautifulSoup
Bailey Parker

2
일반 정보 : 성능이 중요한 경우 lxml대신 라이브러리를 사용하는 것이 좋습니다 (아래 답변 참조). 또한 cssselect매우 유용하며 다른 라이브러리보다 성능이 10 ~ 100 배 더 우수합니다.
Lenar Hoyt

참고 : class속성은 특별합니다 :BeautifulSoup(html).find('div', 'container').text
jfs

85

당신이 찾고있는 것은 pyquery입니다 .

pyquery : 파이썬을위한 jquery와 같은 라이브러리.

원하는 것의 예는 다음과 같습니다.

from pyquery import PyQuery    
html = # Your HTML CODE
pq = PyQuery(html)
tag = pq('div#id') # or     tag = pq('div.class')
print tag.text()

또한 Firefox 또는 Chrome의 inspect 요소와 동일한 선택기를 사용합니다. 예를 들면 다음과 같습니다.

요소 선택기는 'div # mw-head.noprint'입니다.

검사 된 요소 선택기는 'div # mw-head.noprint'입니다. 따라서 pyquery에서는이 선택기를 전달하면됩니다.

pq('div#mw-head.noprint')

2
나는 이것을 위해 당신을 사랑합니다!
progyammer

41

여기서 파이썬의 다양한 HTML 파서와 그 성능에 대해 자세히 읽을 수 있습니다. 기사가 약간 오래되었지만 여전히 좋은 개요를 제공합니다.

파이썬 HTML 파서 성능

기본 제공되지 않더라도 BeautifulSoup을 권장합니다. 이러한 종류의 작업에 대해 작업하기가 쉽기 때문입니다. 예 :

import urllib2
from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen('http://www.google.com/')
soup = BeautifulSoup(page)

x = soup.body.find('div', attrs={'class' : 'container'}).text

2
성능 / 효율성보다는 기능 / 기능을 자세히 설명하는 것을 찾고있었습니다. 편집 : 조기 답변에 대해 죄송합니다. 링크가 실제로 좋습니다. 감사.
ffledgling

첫 번째 포인트 목록 종류의 특징과 기능을 요약합니다 :)
Qiau

5
BeautifulSoup4 (최신 버전)를 사용하는 경우 :from bs4 import BeautifulSoup
Franck Dernoncourt

29

다른 파서 라이브러리와 비교하면 lxml매우 빠릅니다.

그리고 cssselectHTML 페이지를 긁는 데 사용하기도 쉽습니다.

from lxml.html import parse
doc = parse('http://www.google.com').getroot()
for div in doc.cssselect('a'):
    print '%s: %s' % (div.text_content(), div.get('href'))

lxml.html 설명서


HTTPS는 지원되지 않음
Sergio

@Sergio 사용 import requests버퍼 저장 파일 : stackoverflow.com/a/14114741/1518921 (또는 URLLIB), 부하, 구문 분석을 사용하여 파일을 저장 한 후doc = parse('localfile.html').getroot()
Guilherme 나시 멘토를

특정 데이터에 대한 거대한 HTML을 구문 분석합니다. BeautifulSoup으로 그것을하는 데는 시간이 걸렸지 1.7만 대신 lxml 을 적용 하면 거의 *100빨리 배가되었습니다! 성능에 관심이 있다면 lxml 이 최선의 선택입니다
Alex-Bogdanov

9

HTML 구문 분석을 위해 lxml 을 권장 합니다. lxml 사이트의 "HTML 구문 분석"을 참조하십시오 .

내 경험상 Beautiful Soup은 복잡한 HTML을 엉망으로 만듭니다. 나는 Beautiful Soup이 파서가 아니라 매우 우수한 문자열 분석기이기 때문이라고 생각합니다.


3
AIUI 아름다운 수프가 대부분 "백엔드"XML 파서와 함께 작동하도록 만들 수 있습니다, LXML는 지원 파서 중 하나가 될 것으로 보인다 crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser
ffledgling

@ffledgling BeautifulSoup의 일부 기능은 매우 느립니다.
Lenar Hoyt

2

justext 라이브러리를 사용하는 것이 좋습니다 .

https://github.com/miso-belica/jusText

사용법 : Python2 :

import requests
import justext

response = requests.get("http://planet.python.org/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
    print paragraph.text

파이썬 3 :

import requests
import justext

response = requests.get("http://bbc.com/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
    print (paragraph.text)

0

나는 EHP를 사용할 것이다

https://github.com/iogf/ehp

여기있어:

from ehp import *

doc = '''<html>
<head>Heading</head>
<body attr1='val1'>
    <div class='container'>
        <div id='class'>Something here</div>
        <div>Something else</div>
    </div>
</body>
</html>
'''

html = Html()
dom = html.feed(doc)
for ind in dom.find('div', ('class', 'container')):
    print ind.text()

산출:

Something here
Something else

5
설명 해주십시오. 인기있는 BeautifulSoup 또는 lxml보다 EHP를 무엇으로 사용 하시겠습니까?
ChaimG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.