【问题标题】:XPath returns empty list. Why is it ignoring targeted div element?XPath 返回空列表。为什么它忽略了目标 div 元素?
【发布时间】:2017-02-02 21:56:26
【问题描述】:

我是 XPath 和 Scrapy 的新手。我试图定位一个没有唯一类的节点(即class="pubBody")。

已经尝试过: xpath not contains A and B

这应该是一个简单的任务,但 XPath 只是错过了第二项。我正在从scrapy shell中执行此操作。在命令提示符下:

scrapy shell "http://www.sciencedirect.com/science/journal/00221694/"

我正在寻找第二个 div:

<div id="issueListHeader" class="pubBody">...< /div>

<div class="pubBody">... < /div> 

我只能得到第一个而不能得到第二个。类似问题的最佳答案建议尝试以下方法:

hxs.xpath('//div[contains(@class,"pubBody") and not(contains(@id,"issueListHeader"))]') 

但是由于某种原因这会返回一个空列表。请问有什么帮助吗?一定是错过了什么愚蠢的东西,我已经尝试了好几天了!

其他细节:

曾经在scrapy shell中:

import scrapy

xs = scrapy.Selector(response)

hxs.xpath('//div[@class="pubBody"]')

仅适用于第一个 div 元素:

[<Selector xpath='//div[@class="pubBody"]' data='<div id="issueListHeader" class="pubBody'>]

对于失败的第二个 div 元素,我也尝试过:

hxs.xpath('//div[@class="pubBody" and not(@id="issueListHeader")]').extract_first()

hxs.xpath('//div[starts-with(@class, "pubBody") and not(re:test(@id, "issueListHeader"))]')

也是直接从Chrome复制XPath,还返回'[]':

hxs.xpath('//*[@id="issueList"]/div/form/div[2]')

【问题讨论】:

标签: python html xpath scrapy html-parsing


【解决方案1】:

问题在于 HTML 在此页面上的格式远非良好。为了演示,看看相同的 CSS 选择器如何使用 Scrapy 生成 0 个结果并在 BeautifulSoup 中生成 94 个结果:

In [1]: from bs4 import BeautifulSoup

In [2]: soup = BeautifulSoup(response.body, 'html5lib')  # note: "html5lib" has to be installed

In [3]: len(soup.select(".article h4 a"))
Out[3]: 94

In [4]: len(response.css(".article h4 a"))
Out[4]: 0

您尝试定位的 pubBody 元素也是如此:

In [6]: len(response.css(".pubBody"))
Out[6]: 1

In [7]: len(soup.select(".pubBody"))
Out[7]: 2

所以,尝试连接 BeautifulSoup 来修复/清理 HTML - 最好通过 middleware


我创建了一个简单的scrapy_beautifulsoup middleware 来轻松连接到项目中:

  • 通过 pip 安装:

    pip install scrapy-beautifulsoup
    
  • settings.py中配置中间件:

    DOWNLOADER_MIDDLEWARES = {
        'scrapy_beautifulsoup.middleware.BeautifulSoupMiddleware': 543
    }
    BEAUTIFULSOUP_PARSER = "html5lib" 
    

利润。

【讨论】:

  • 谢谢@alecxe!您的中间件完成了工作! PS。在从 4.4.1 升级到 4.5.1 后,我也遇到了没有更新漂亮汤的问题(stackoverflow.com/questions/38447738/…)旁注:在您的 GitHub“自述文件”块中,您将 settings.py 更改分为两个代码块.将两个设置更改放在一个块中(就像您在此答案中所做的那样)对于新手来说更容易理解!再次感谢!!
【解决方案2】:

我怀疑问题在于您尝试解析的页面的源 (http://www.sciencedirect.com/science/journal/00221694/) 不是有效的 XML,因为 &lt;link ...&gt; 节点/元素/标签没有结束标签。可能还有其他问题,但这些是我发现的第一个问题。

我对 Javascript 生疏了,但您可以尝试将 DOM 向下导航到页面中的较低级别(即正文或其他一些更靠近您尝试定位的元素的节点),然后执行 XPath从那个层面。

更新:我刚刚尝试删除文档的 &lt;head&gt; 并将其传递给 XML 解析器,但它仍然会在未关闭的服务器 &lt;input&gt; 节点上中断。除非我忘记了一些特殊的 JavaScript XML/XPath 规则方法来消除结束标记,否则我怀疑您可能更适合使用 JQuery 之类的东西来查找您正在寻找的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多