首页 文章

奇怪的XPath导致Scrapy shell

提问于
浏览
1

我正在尝试在页面上选择一个项目:

http://www.betterware.co.uk/catalog/product/view/id/4530/category/342/

使用XPath的变体,例如:

sel.xpath('//div[@class="price-box"]/span[@class="regular-price"]/span[@class="price"]/text()').extract()

我正在看的html源代码是:

<div class="price-box">
    <span class="regular-price" id="product-price-4530">
        <span class="price">£12.99</span>
    </span>
</div>

我得到了一堆甚至没有出现在页面源中的其他数字,而不是获得正确的 [u'£12.99'] . Scrapy shell给出:

[u'\xa312.99',
 u'\xa38.99',
 u'\xa38.99',
 u'\xa34.49',
 u'\xa34.49',
 u'\xa329.99',
 u'\xa329.99']

我已经毫不费力地以这种方式选择其他物品,但是这个和我所有的其他价格领域正在为价格文本带来这些神秘的结果 . 有人可以在这里为我点上一些亮点吗?我选择项目的python代码是:

def parse_again(self, response):
    sel = Selector(response)
    meta = sel.xpath('//div[@class="product-main-info"]')
    items = []
    for m in meta:
        item = BetterItem()
        item['link'] = response.url
        item['item_name'] = m.select('//div[@class="product-name"]/h1/text()').extract()
        item['sku'] = m.select('//p[@class="product-ids"]/text()').extract()
        item['price'] = m.select('//div[@class="price-box"]/span/span/text()').extract()
        items.append(item)
    return items

1 回答

  • 1

    Scrapy返回的结果没有任何问题 . u'\xa3' 是英镑符号:

    In [99]: import unicodedata as UD
    
    In [100]: UD.name(u'\xa3')
    Out[100]: 'POUND SIGN'
    
    In [101]: print(u'\xa3')
    £
    

    u'\xa312.99' 是英镑符号 u'\xa3 ,后跟unicode u'12.99' .

    如果你想从列表中删除英镑符号,你可以这样做:

    In [108]: data = [u'\xa312.99',
     u'\xa38.99',
     u'\xa38.99',
     u'\xa34.49',
     u'\xa34.49',
     u'\xa329.99',
     u'\xa329.99']
    
    In [110]: [float(item.lstrip(u'\xa3')) for item in data]
    Out[110]: [12.99, 8.99, 8.99, 4.49, 4.49, 29.99, 29.99]
    

    对于处理unicode的人来说,以下文章是“必读”:

    特别是对于以Python为中心的观点:

相关问题