Python XPath返回空列表。为什么它会忽略目标div元素?
我是XPath和Scrapy的新手。我试图将目标指向没有唯一类的节点(即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> 但由于某些原因,这将返回一个空列表。需要
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"