Không, bản thân BeautifulSoup không hỗ trợ các biểu thức XPath.
Một thư viện thay thế, lxml , không hỗ trợ XPath 1.0. Nó có chế độ tương thích với BeautifulSoup , nơi nó sẽ thử và phân tích cú pháp HTML bị hỏng theo cách của Soup. Tuy nhiên, trình phân tích cú pháp HTML lxml mặc định thực hiện tốt công việc phân tích cú pháp HTML bị hỏng và tôi tin rằng nó nhanh hơn.
Khi bạn đã phân tích cú pháp tài liệu của mình thành cây lxml, bạn có thể sử dụng .xpath()
phương pháp này để tìm kiếm các phần tử.
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)
Ngoài ra còn có một mô-đun chuyên dụnglxml.html()
với chức năng bổ sung.
Lưu ý rằng trong ví dụ trên, tôi đã truyền response
trực tiếp đối tượng đến lxml
, vì để trình phân tích cú pháp đọc trực tiếp từ luồng sẽ hiệu quả hơn đọc phản hồi thành một chuỗi lớn trước. Để thực hiện tương tự với requests
thư viện, bạn muốn đặt stream=True
và chuyển response.raw
đối tượng vào sau khi bật giải nén truyền tải minh bạch :
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)
Bạn có thể quan tâm đến CSS Selector ; các CSSSelector
lớp dịch báo cáo CSS vào các biểu thức XPath, làm cho tìm kiếm của bạn cho td.empformbody
rằng dễ dàng hơn nhiều:
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
Đến vòng tròn đầy đủ: BeautifulSoup bản thân không có rất đầy đủ hỗ trợ CSS selector :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.