不,BeautifulSoup本身不支持XPath表达式。
一个替代库,lxml,支持XPath 1.0。它有一个与BeautifulSoup兼容的模式,可以尝试解析破损的HTML。然而,lxml默认的HTML解析器同样能很好地解析破损的HTML,并且我相信速度更快。
一旦您将文档解析为lxml树,就可以使用.xpath()
方法搜索元素。
try:
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 support;CSSSelector
类将 CSS 语句转换为 XPath 表达式,从而使查找 td.empformbody
变得更加容易:
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
回到起点:BeautifulSoup本身确实有非常完整的CSS选择器支持:
for cell in soup.select('table#foobar td.empformbody'):