【问题标题】:XPath returns no result for some elements with scrapy shell对于带有scrapy shell 的某些元素,XPath 不返回任何结果
【发布时间】:2020-04-14 05:02:11
【问题描述】:

我正在使用scrapy shell提取以下网页的数据:

https://www.apo-in.de/product/acc-akut-600-brausetabletten.24170.html

大多数数据都有效,但下部有一个表格,其中内容(例如 PZN)我似乎无法提取。

scrapy shell
fetch('https://www.apo-in.de/product/acc-akut-600-brausetabletten.24170.html')
>>> response.xpath('//*[@id="accordionContent5e95408f73b10"]/div/table/tbody/tr[1]/td/text()').extract()

返回:[]

我还下载了该页面以供scrapy看到它:

scrapy fetch --nolog https://www.apo-in.de/product/acc-akut-600-brausetabletten.24170.html > test.html

虽然它在 HTML 中看起来不错,虽然我可以在 chrome 中抓取它,但它在 scrapy shell 中不起作用。

如何检索这些数据?

【问题讨论】:

    标签: python xpath scrapy


    【解决方案1】:

    您遇到的问题是 id 'accordionContent5e95408f73b10' 是动态生成的。因此,浏览器中的 id 和 scrapy 的响应是不同的。

    在常见情况下,使用“子字符串搜索”(//*[contains(@id, 'accordionContent')]) 编写 xpath 是一种很好的解决方法,但在这种情况下有很多这样的 id。

    我可以建议编写更复杂的 xpath。

    //div[@id='accordion']/div[contains(@class, 'panel')][1]/div[contains(@id, 'accordionContent')]/div[@class='panel-body']/table/tbody/tr[1]/td
    

    这个 xpath 做了什么:

    1. 找到所有带有//div[@id='accordion']/div[contains(@class, 'panel')]描述的“子面板”;

    2. 我们得到第一个“子面板”(PZN 所在的位置)并导航到包含数据的表格://div[@id='accordion']/div[contains(@class, 'panel')][1]/div[contains(@id, 'accordionContent')]/div[@class='panel-body']/table;

    3. 最后一部分是检索第一个 tr 的 td。

    顺便说一下,xpath 可以简化为 //div[@id='accordion']/div[contains(@class, 'panel')][1]//table/tbody/tr[1]/td 。但我已经编写了完整的 xpath,以便更准确地了解我们正在导航的内容。

    【讨论】:

    • 完成,一个最短的选择://td[preceding-sibling::th[.="PZN"]]
    • 谢谢!现在我明白发生了什么,我也通过你的最后评论得到了 PZN。请允许我提出 2 个问题: 1. 你是如何检索相应的 div 和 ID 的。有没有不查看如此大量代码的简单方法? 2. 请解释.= 语法。我查找了前面的兄弟语法,但找不到 .= 最后一个看起来是最好和最简单的解决方案。
    • 1.我通过分析页面的 DOM 树检索了 div 和 id。所需内容位于 id 为“手风琴”的 div 中。这个id是唯一的,所以我们可以使用它。 E.Wiest 提供了更短、更快的 xpath,但使用了特殊的 xpath 操作符前同级。让我解释一下他的表情。它找到前面有标签 TH 和文本“PZN”的 TD 标签。运算符 '.=' 类似于 'text()' (//td[preceding-sibling::th[text()="PZN"]] 发现相同)
    猜你喜欢
    • 2018-01-21
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多