223

Python のリスト/辞書/オブジェクトの形式でタグを取得するのに役立つ、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 を提案していますが、機能を詳しく説明しているものはほとんどなく、どちらがより高速で効率的かという議論に終わります。

4

7 に答える 7

247

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 のしくみを読んでください。その公式ドキュメントを見てください。

于 2012-07-29T12:12:15.873 に答える
101

あなたが探しているのは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 要素と同じセレクターを使用します。例えば:

要素セレクターは「div#mw-head.noprint」です

検査対象の要素セレクターは「div#mw-head.noprint」です。したがって、pyquery では、このセレクターを渡すだけで済みます。

pq('div#mw-head.noprint')
于 2012-07-29T12:47:39.553 に答える
44

ここでは、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
于 2012-07-29T12:07:25.860 に答える
31

他のパーサー ライブラリと比較して、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 ドキュメント

于 2014-11-08T01:08:26.443 に答える
9

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

私の経験では、Beautiful Soup はいくつかの複雑な HTML を台無しにします。これは、Beautiful Soup がパーサーではなく、非常に優れた文字列アナライザーであるためだと思います。

于 2014-10-25T18:50:16.673 に答える