いいえ、BeautifulSoup 自体は XPath 式をサポートしていません。
代替ライブラリlxmlは、XPath 1.0 をサポートしています。壊れた HTML をスープのように解析しようとする BeautifulSoup 互換モードがあります。ただし、デフォルトの lxml HTML パーサーは、破損した HTML を解析するのと同じくらいうまく機能し、より高速であると私は信じています。
ドキュメントを lxml ツリーに解析したら、.xpath()
メソッドを使用して要素を検索できます。
try:
# Python 2
from urllib2 import urlopen
except ImportError:
from urllib.request import urlopen
from lxml import etree
url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = urlopen(url)
htmlparser = etree.HTMLParser()
tree = etree.parse(response, htmlparser)
tree.xpath(xpathselector)
追加機能を備えた専用lxml.html()
モジュールもあります。
上記の例では、response
オブジェクトを に直接渡したことに注意してくださいlxml
。パーサーにストリームから直接読み取らせる方が、最初に応答を大きな文字列に読み取るよりも効率的だからです。requests
ライブラリで同じことを行うには、transparent transport decompression を有効にした後、オブジェクトを設定stream=True
して渡します。response.raw
import lxml.html
import requests
url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = requests.get(url, stream=True)
response.raw.decode_content = True
tree = lxml.html.parse(response.raw)
あなたが興味を持っている可能性があるのは、CSS セレクターのサポートです。CSSSelector
クラスは CSS ステートメントを XPath 式に変換し、その検索をより簡単にしますtd.empformbody
。
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
完全な循環: BeautifulSoup 自体には、非常に完全なCSS セレクターのサポートがあります。
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.