一个站点上的Scrapy Regex可能不使用正常编码

2024-10-06 10:35:06 发布

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

所以对于20+的网站,我有这个蜘蛛爬行通过,所有的价格项目收益刚刚好。。。然而,在这个特定的站点(https://www.garrafeiranacional.com/)上有一个非常恼人的问题。。你知道吗

当我从特定产品中提取价格信息时,在没有任何mapcose/Regex清理的情况下自然返回的信息是这样的:

  • '14,55\xa0€',或者更恼人的是:
  • '9\xa0600,00\xa0€'

在你问之前,我已经尝试了我能想到的每一种组合,通常我会这样做:

productLoader.add_xpath('blah', 'blah', MapCompose(lambda i: i.lstrip(punctuation)
    .strip().replace('"', '').replace('.', ','), re = '[^\\d]+'))

甚至尝试正则表达式,比如:

  • '\b\d[\d,.]*\b'
  • 还有无数其他的,无论是在MapCompose内部,还是在没有MapCompose的情况下

我甚至试过用回复sub()在MapCompose中,例如:

  • “(?<;=\d)\\S+“(对最后一个数字后的所有内容进行正向前瞻)

因此,我假设问题是这个网站使用的编码,因为我在网站上抓取的一点信息,其中有一个空格,会产生相同的奇怪的\xa0字符串。。。我试着从价格中去掉空白,但似乎没有什么效果。如果有人对我应该去哪里等有什么想法,我很乐意听他们说


Tags: 项目https信息站点网站www情况价格
1条回答
网友
1楼 · 发布于 2024-10-06 10:35:06

\xa0只是一个non-breaking space。你知道吗

例如,在this page上,下面是一些包含价格值的HTML:

<div class="price-box price-final_price" data-role="priceBox" data-product-id="19815">
<span class="price-container price-final_price tax weee"
         itemprop="offers" itemscope itemtype="http://schema.org/Offer">
        <span  id="product-price-19815"                data-price-amount="7490"
        data-price-type="finalPrice"
        class="price-wrapper ">
        <span class="price">7 490,00 €</span>    </span>
                <meta itemprop="price" content="7490" />
        <meta itemprop="priceCurrency" content="EUR" />
    </span>
</div>

如果您选择使用<span class="price">7 490,00 €</span>来获取价格,只需将'\xa0'替换为' '或空字符串:

$ scrapy shell https://www.garrafeiranacional.com/catalog/product/view/id/19815/s/1945-petrus-tinto/category/361/
2017-07-21 10:20:42 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
(...)
2017-07-21 10:20:47 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.garrafeiranacional.com/catalog/product/view/id/19815/s/1945-petrus-tinto/category/361/> (referer: None)

>>> response.css('span.price').get()
'<span class="price">7\xa0490,00\xa0€</span>'
>>> response.css('span.price::text').get()
'7\xa0490,00\xa0€'

>>> response.css('span.price::text').get().replace('\u00A0', '')
'7490,00€'

另一个可能更容易在程序中消化的选项是使用页面中该价格信息的其他位置。在上面的同一个HTML片段中,您可以看到:

    <meta itemprop="price" content="7490" />
    <meta itemprop="priceCurrency" content="EUR" />

它也在<head>部分:

<meta property="product:price:amount" content="7490"/>
<meta property="product:price:currency" content="EUR"/>

相关问题 更多 >