我是XPath和Scrapy的新手。我试图以没有唯一类(即class="pubBody"
)的节点为目标。在
已经尝试过: xpath not contains A and B
这应该是一个简单的任务,但是XPath只是遗漏了第二项。我是从破壳里做这件事的。在命令提示符下:
破壳“http://www.sciencedirect.com/science/journal/00221694/”
我在找第二个div:
<div id="issueListHeader" class="pubBody">...< /div>
<div class="pubBody">... < /div>
我只能得到第一个,不能得到第二个。对类似问题的最佳答案是,尝试以下几点:
^{pr2}$但由于某种原因,这会返回一个空列表。有什么帮助吗?一定是错过了什么傻事,我已经试了好几天了!在
其他细节:
一旦进入破壳:
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]')
我怀疑问题是您试图解析的页面的源代码(http://www.sciencedirect.com/science/journal/00221694/)不是有效的XML,因为
<link ...>
节点/元素/标记没有结束标记。可能还有其他问题,但这些是我发现的第一个问题。在我不熟悉Javascript,但您可以尝试向下导航DOM到页面中的较低级别(即body或更靠近您要目标的元素的其他节点),然后从该级别执行XPath。在
更新:我刚刚尝试删除文档的
<head>
,并将其传递给XML解析器,但它仍然在未关闭的服务器<input>
节点上中断。除非我忘记了一些特殊的JavaScript XML/XPath规则方法,否则我想您可能更适合使用JQuery之类的方法来查找您要查找的元素。在问题是HTML在这个页面上的格式远远不够好。要演示,请查看相同的CSS选择器如何使用Scrapy生成0个结果,并在^{} 中生成94个结果:
您要查找的
^{pr2}$pubBody
元素也是如此:所以,尝试连接
BeautifulSoup
来修复/清理HTML—最好是通过middleware。在我创建了一个简单的^{} middleware 来轻松连接到项目中:
通过pip安装:
在
settings.py
中配置中间件:利润。在
相关问题 更多 >
编程相关推荐