不,BeautifulSoup本身不支持XPath表达式。
另一种库,LXML,不支持的XPath 1.0。它具有BeautifulSoup兼容模式,它将尝试以Soup的方式解析损坏的HTML。但是,默认的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.