Tidak, BeautifulSoup, dengan sendirinya, tidak mendukung ekspresi XPath.
Sebuah perpustakaan alternatif, lxml , apakah dukungan XPath 1.0. Ini memiliki mode kompatibel BeautifulSoup di mana ia akan mencoba dan mengurai HTML yang rusak seperti yang dilakukan Soup. Namun, parser HTML lxml default melakukan pekerjaan yang sama baiknya untuk mem -parsing HTML yang rusak, dan saya yakin lebih cepat.
Setelah Anda mengurai dokumen Anda menjadi pohon lxml, Anda dapat menggunakan .xpath()
metode untuk mencari elemen.
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)
Ada juga modul khususlxml.html()
dengan fungsionalitas tambahan.
Perhatikan bahwa dalam contoh di atas saya meneruskan response
objek secara langsung lxml
, karena memiliki parser yang dibaca langsung dari aliran lebih efisien daripada membaca respons menjadi string besar terlebih dahulu. Untuk melakukan hal yang sama dengan requests
library, Anda ingin menyetel stream=True
dan meneruskan response.raw
objek setelah mengaktifkan dekompresi transport transparan :
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)
Yang mungkin menarik bagi Anda adalah dukungan Pemilih CSS ; yang CSSSelector
kelas diterjemahkan pernyataan CSS ke dalam ekspresi XPath, membuat pencarian Anda untuk td.empformbody
yang jauh lebih mudah:
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
Lingkaran penuh: BeautifulSoup sendiri memang memiliki dukungan pemilih CSS yang sangat lengkap :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.