当前位置: 首页 > 面试题库 >

我们可以将xpath与BeautifulSoup一起使用吗?

南宫博简
2023-03-14
问题内容

我正在使用BeautifulSoup抓取网址,并且我有以下代码

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兼容模式,它将以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.


 类似资料:
  • 我正在使用BeautifulSoup刮取一个URL,并使用以下代码查找标记,其类为: 现在,在上面的代码中,我们可以使用获取标记和与它们相关的信息,但我想使用XPath。是否可以将XPath与BeautifulSoup一起使用?如果可能,请给我提供示例代码。

  • 问题内容: 我看到了其他有关xpath 2.0的问题,它显然简化了字符串表达式。我正在使用Firefox 3.5.5和Selenium 1.0.1。 如何检查我的Firefox和Selenium版本是否支持它? Selenium是否遵循Firefox的内置Xpath实现? 在那种情况下,如果我开始将另一个(也许是较旧的)浏览器与selenium一起使用,是否会因为期望xpath 2.0而遇到问题?

  • 就像在主题中一样,我可以使用Thymeleaf布局方言和spring吗?我必须使用Spring标准方言吗? 网上有这么多的资料,这让我很困惑。 我已经开始使用布局方言,但我无法使用整个应用程序。 这是我的模板主文件: 以及控制器返回的我的示例主体文件: 但不幸的是,这段代码只适用于布局方言。 有人能帮我把代码转换成spring标准方言吗? 我的手机配置:

  • 问题内容: 我正在使用大猩猩架构根据用户的表单提交来填充结构。我的结构包含,并且我目前收到以下错误: 如何在要使用大猩猩架构填充的结构中使用? 问题答案: 我创建了一个要点(https://gist.github.com/carbocation/51b55297702c7d30d3ef),它显示了解决此问题的一种方法。您需要为以下四种类型的每一种创建一个:sql.NullString,sql.Nu

  • 问题内容: 我有一类范围 如果我使用正常的工作原理是完美的,但是必须等待每个命令完成并且每个查询需要8秒钟,所以10个查询需要80秒钟。 在并行版本中,如果仅打印范围,则效果很好,但如果尝试执行命令,则说明该过程已在进行中。 {“操作已经在进行中。”} 我该如何解决? 问题答案: Npgsql连接不能同时使用-在任何给定时间点只能运行一个命令(换句话说,没有MARS支持)。 打开多个连接以并行执行

  • 问题内容: 是否可以使用Node.js在服务器端使用jQuery选择器/ DOM操作? 问题答案: 似乎有一个重大更新,导致原来的答案不再起作用。我找到了这个答案,解释了现在如何使用。我已经在下面复制了相关代码。 注意:原始答案没有提及你还需要使用安装