いいえ、BeautifulSoup自体は、XPath式をサポートしていません。
代替ライブラリー、lxmlのは、ありませんサポートのXPath 1.0を。それは、Soupと同じように壊れた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
ライブラリで同じことを行うには、透過的なトランスポート解凍を有効に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.