Python XPath返回空列表。为什么它会忽略目标div元素?

Python XPath返回空列表。为什么它会忽略目标div元素?,python,html,xpath,scrapy,html-parsing,Python,Html,Xpath,Scrapy,Html Parsing,我是XPath和Scrapy的新手。我试图将目标指向没有唯一类的节点(即class=“pubBody”) 已尝试: 这应该是一个简单的任务,但是XPath忽略了第二项。我是从脏壳上做这件事的。在命令提示下: 刮壳“ 我在找第二组: <div id="issueListHeader" class="pubBody">...< /div> <div class="pubBody">... < /div> 但由于某些原因,这将返回一个空列表。需要

我是XPath和Scrapy的新手。我试图将目标指向没有唯一类的节点(即
class=“pubBody”

已尝试:

这应该是一个简单的任务,但是XPath忽略了第二项。我是从脏壳上做这件事的。在命令提示下:

刮壳“

我在找第二组:

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

<div class="pubBody">... < /div> 
但由于某些原因,这将返回一个空列表。需要帮忙吗?一定是错过了什么傻事,我已经试了好几天了

其他详情:

一旦进入刮痕壳:

import scrapy

xs = scrapy.Selector(response)

hxs.xpath('//div[@class="pubBody"]')
仅适用于第一个div元素:

[<Selector xpath='//div[@class="pubBody"]' data='<div id="issueListHeader" class="pubBody'>]
还直接从Chrome复制了XPath,但还返回“[]”:

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

我怀疑问题在于,由于
节点/元素/标记没有结束标记,您试图解析的页面()的源不是有效的XML。可能还有其他问题,但这些是我发现的第一个问题

我对Javascript很生疏,但您可以尝试在DOM中向下导航到页面中的较低级别(即,body或其他更接近您试图针对的元素的节点),然后从该级别执行XPath

更新:我刚刚尝试删除文档的
并将其传递给XML解析器,但它仍然会在未关闭的服务器
节点上中断。除非我忘记了一些特殊的JavaScript XML/XPath规则方法,这些方法可以消除结束标记,否则我认为您可能更适合使用JQuery之类的工具来查找您要查找的元素。

问题是HTML在这个页面上的格式远远不够。要演示,请参见相同的CSS选择器如何使用Scrapy生成0结果,并生成94英寸:

您尝试查找的
pubBody
元素也是如此:

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

In [7]: len(soup.select(".pubBody"))
Out[7]: 2
因此,尝试连接
BeautifulSoup
来修复/清理HTML——理想情况下是通过


我创建了一个简单的连接到项目中的方法:

  • 通过pip安装:

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

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

利润。

谢谢@alecxe!你的中间件完成了任务!!另外,在从4.4.1升级到4.5.1之后,我还遇到了一个问题,就是没有更新beautiful soup。所有功能都正常()旁注:在GitHub“自述”块上,您将settings.py更改分为两个代码块。将两个设置更改放在一个块中(就像你在这个答案中所做的那样)对于新手来说更容易理解!再次感谢!!
In [6]: len(response.css(".pubBody"))
Out[6]: 1

In [7]: len(soup.select(".pubBody"))
Out[7]: 2
pip install scrapy-beautifulsoup
DOWNLOADER_MIDDLEWARES = {
    'scrapy_beautifulsoup.middleware.BeautifulSoupMiddleware': 543
}
BEAUTIFULSOUP_PARSER = "html5lib"