python - 我们可以将 XPath 与 BeautifulSoup 一起使用吗?

标签 python web-scraping xpath beautifulsoup urllib

我正在使用 BeautifulSoup 抓取一个 URL,并且我有以下代码,以查找其类为 'empformbody'td 标记:

import urllib
import urllib2
from BeautifulSoup import BeautifulSoup

url =  "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
req = urllib2.Request(url)
response = urllib2.urlopen(req)
the_page = response.read()
soup = BeautifulSoup(the_page)

soup.findAll('td',attrs={'class':'empformbody'})

现在在上面的代码中,我们可以使用 findAll 来获取标签和相关信息,但我想使用 XPath。是否可以将 XPath 与 BeautifulSoup 一起使用?如果可能,请提供示例代码。

最佳答案

不,BeautifulSoup 本身不支持 XPath 表达式。

另一个库,lxml , 确实支持 XPath 1.0。它有一个 BeautifulSoup compatible mode它将尝试以 Soup 的方式解析损坏的 HTML。但是,default lxml HTML parser在解析损坏的 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)

还有一个dedicated lxml.html() module具有附加功能。

请注意,在上面的示例中,我将 response 对象直接传递给 lxml,因为让解析器直接从流中读取比将响应读取到首先是大字符串。要对 requests 库执行相同操作,您需要设置 stream=True 并传入 response.raw 对象 after enabling transparent transport decompression :

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):
    # Do something with these table cells.

即将结束:BeautifulSoup 本身确实有非常完整的CSS selector support :

for cell in soup.select('table#foobar td.empformbody'):
    # Do something with these table cells.

关于python - 我们可以将 XPath 与 BeautifulSoup 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11465555/

相关文章:

python - 删除/删除 pandas DataFrame 中任意列中具有特定字符串的行

javascript - 解析 XMLHttpRequest() 结果(使用 XPath)

Python ctypes 'c_char_p' 内存泄漏

python - 向量化 numpy 数组 for 循环

python - 合并没有匹配列的数据框

html - 如何使用vba填写html自动完成字段?

excel - 使用 CSS 选择器按下一个元素提取跨度文本

javascript - scrapy抓取的数据包含javascript

java - selenium 中的 WebElement 使用 attr 选择

python - 如何在单个项目中获取scrapy xpath输出