web-dev-qa-db-ja.com

Pythonを使用してHTMLを解析する

私は、Pythonのリスト/辞書/オブジェクトの形式でタグを取得するのに役立つ、Python用のHTML Parserモジュールを探しています。

私がフォームの文書を持っているならば:

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

divタグ内に含まれるclass='container'を含むbodyタグ内のコンテンツ/テキストを取得するように基本的に依頼できるように、HTMLタグの名前またはIDを使用してネストされたタグにアクセスする方法を教えてください。 。

Firefoxの「要素の検査」機能(HTMLの表示)を使用したことがあれば、ツリーのようにすてきな方法ですべてのタグが表示されることがわかります。

私は組み込みモジュールを好むと思いますが、それはもうちょっと質問しすぎるかもしれません。


私はStack Overflowとインターネット上のいくつかのブログについて多くの質問をしました、そしてそれらのほとんどはBeautifulSoupかlxmlかHTMLParserを示唆しますがこれらの詳細のいくつかは機能を詳細に説明します。

154
ffledgling

基本的に、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のしくみを読んでください。その 公式文書 を見てください。

166
Aadaam

探しているものは pyquery

pyquery:Python用の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要素と同じセレクタを使います。例えば:

the element selector is 'div#mw-head.noprint'

検査された要素セレクターは 'div#mw-head.noprint'です。そのため、pyqueryでは、このセレクタを渡す必要があります。

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

ここでは、PythonのさまざまなHTMLパーサーとそのパフォーマンスについてさらに詳しく読むことができます。この記事は少し古くなっていますが、それでも概要はわかります。

Python 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
36
Qiau

他のパーサライブラリと比べてlxmlは非常に速いです:

そしてcssselectを使えば、HTMLページをスクラップするのにもとても簡単に使えます。

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 Documentation

24
Lenar Hoyt

HTMLの解析には、lxmlをお勧めします。 「HTMLの解析」(lxmlサイト)を参照してください。

私の経験では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

Python3:

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)
1
Wesam Na

私は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
0
Unknown Soldier