首页 > 解决方案 > Xpath 响应总是返回 null

问题描述

我正在尝试学习 Scrapy:这是我用来在这个包上抓取价格信息的 url。“ https://www.net-a-porter.com/ca/en/product/1100692/chloe/roy-day-small-leather-and-suede-shoulder-bag

还有其他值也返回 null,但对于基本情况,让我们只考虑价格

 yield {
        'price' : response.xpath("//nap-price[@class='product-price']/span[@itemprop='price']/text()").extract_first(),}

返回值始终为空。但是,当我通过开发工具运行它时,它告诉我字符串应该匹配

我试过的其他字符串:

"//nap-price[@class='product-price']/span[@class='full-price style-scope nap-price']/text()"

"//nap-price[@class='product-price']/span[2]/text()"

//nap-price[@class='product-price']/span[2]/@content

以及其他一些在开发工具中工作但在使用scrapy运行时总是返回空响应这里发生了什么?我已经尝试使用匹配字符串变得非常具体和通用,但似乎没有任何效果。

标签: pythonxpathweb-scrapingscrapy

解决方案


你不能总是信任 devtools 中的“检查元素”,因为它显示了最终的 HTML,在它被 Javascript 渲染之后。一个技巧是复制价格,说“1850”,右键单击“查看页面源代码”打开页面源代码(在 Firefox 中,在 Chrome 中类似这样)并在其上搜索价格以查看信息来源是。

你会发现这个标签包含有用的信息:

<meta class="product-data"
    data-designer-name="Chloe"
    data-designer-id="122"
    data-analytics-key="Roy Day small leather and suede shoulder bag"
    data-pid="1100692"
    data-breadcrumb-names="Bags / Shoulder Bags / Cross Body"
    data-breadcrumb-keys="Bags / Shoulder_Bags / Cross_Body"
    data-breadcrumb-ids="1282 / 1335 / 6012"
    data-sold-out="false"
    data-price-full="185000"
    data-price="185000"
/>

所以你可以写一个这样的css选择器:

response.css('meta.product-data::attr(data-price)').extract_first()

或使用 xpath:

response.xpath('//meta[@class="product-data"]/@data-price').extract_first()

希望这可以帮助。


推荐阅读