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

2024-10-01 19:29:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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]')

Tags: anddivid元素notselectorxpathclass
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个结果:

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元素也是如此:

^{pr2}$

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


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

  • 通过pip安装:

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

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

利润。在

相关问题 更多 >

    热门问题