ไม่ BeautifulSoup โดยตัวมันเองไม่รองรับนิพจน์ XPath
ห้องสมุดทางเลือกlxml , ไม่สนับสนุน XPath 1.0 มีโหมดที่เข้ากันได้กับ BeautifulSoupซึ่งจะพยายามแยกวิเคราะห์ HTML ที่ใช้งานไม่ได้เหมือนที่ Soup ทำ อย่างไรก็ตามโปรแกรมแยกวิเคราะห์ HTML lxml เริ่มต้นทำงานได้ดีในการแยกวิเคราะห์ 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 Selector ; 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.