[python] 파이썬을 사용하여 HTML 파싱

파이썬 목록 / 사전 / 객체의 형태로 태그를 얻는 데 도움이되는 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를 제안하지만 이러한 기능 중 일부는 기능을 자세히 설명하지 않으며 어떤 것이 더 빠르고 더 효율적인지에 대한 토론으로 끝납니다.



답변

그래서 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의 작동 방식을 읽으십시오. 그것 봐 공식 문서 .


답변

당신이 찾고있는 것은 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')


답변

여기서 파이썬의 다양한 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


답변

다른 파서 라이브러리와 비교하면 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 설명서


답변

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

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


답변

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)


답변

나는 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