私は、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を示唆しますがこれらの詳細のいくつかは機能を詳細に説明します。
基本的に、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: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'です。そのため、pyqueryでは、このセレクタを渡す必要があります。
pq('div#mw-head.noprint')
ここでは、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
他のパーサライブラリと比べて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'))
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)
私は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