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.
Saya dapat mengonfirmasi bahwa tidak ada dukungan XPath dalam Beautiful Soup.
sumber
Seperti yang dikatakan orang lain, BeautifulSoup tidak memiliki dukungan xpath. Mungkin ada beberapa cara untuk mendapatkan sesuatu dari xpath, termasuk menggunakan Selenium. Namun, berikut adalah solusi yang berfungsi baik di Python 2 atau 3:
Saya menggunakan ini sebagai referensi.
sumber
urllib2
pustaka yang digunakan ke Python 3urllib.request
?BeautifulSoup memiliki fungsi bernama findNext dari elemen saat ini yang diarahkan ke childern, jadi:
Kode di atas dapat meniru xpath berikut:
sumber
Saya telah mencari melalui dokumen mereka dan tampaknya tidak ada opsi xpath. Juga, seperti yang Anda lihat di sini pada pertanyaan serupa tentang SO, OP meminta terjemahan dari xpath ke BeautifulSoup, jadi kesimpulan saya adalah - tidak, tidak ada penguraian xpath yang tersedia.
sumber
ketika Anda menggunakan lxml semuanya sederhana:
tetapi saat menggunakan BeautifulSoup BS4 semuanya juga sederhana:
coba sihir ini:
seperti yang Anda lihat, ini tidak mendukung sub-tag, jadi saya menghapus bagian "/ @ href"
sumber
select()
untuk pemilih CSS, ini sama sekali bukan XPath. seperti yang Anda lihat, ini tidak mendukung sub-tag Meskipun saya tidak yakin apakah itu benar pada saat itu, yang pasti tidak sekarang.Mungkin Anda dapat mencoba yang berikut ini tanpa XPath
sumber
Di atas digunakan kombinasi objek Soup dengan lxml dan satu dapat mengekstrak nilai menggunakan xpath
sumber
Ini adalah utas yang cukup lama, tetapi ada solusi penyelesaian sekarang, yang mungkin belum ada di BeautifulSoup pada saat itu.
Inilah contoh dari apa yang saya lakukan. Saya menggunakan modul "request" untuk membaca RSS feed dan mendapatkan konten teksnya dalam variabel yang disebut "rss_text". Dengan itu, saya menjalankannya melalui BeautifulSoup, mencari xpath / rss / channel / title, dan mengambil isinya. Ini bukan XPath dalam semua kemuliaannya (wildcard, banyak jalur, dll.), Tetapi jika Anda hanya memiliki jalur dasar yang ingin Anda temukan, ini berfungsi.
sumber