1

我正在尝试 Scrapy。我有以下内容:

hxs.select('//span[contains(@itemprop, "price")]').extract()

输出:

[u'<span itemprop="price" class="offer_price">\n<span class="currency">\u20ac</span>\n16<span class="offer_price_fraction">,95</span>\n</span>']

如何检索此输出:

16.95

换句话说,用小数价格跨度添加价格 + 用 替换 , 。

4

2 回答 2

1

使用这个单一的 XPath 表达式:

   translate(
             concat(//span[@itemprop = 'price']/text()[normalize-space()],
                    //span[@itemprop = 'price']/span[@class='offer_price_fraction']
                    ),
             ',',
             '.'
             )

基于 XSLT 的验证:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "translate(
          concat(//span[@itemprop = 'price']/text()[normalize-space()],
                  //span[@itemprop = 'price']/span[@class='offer_price_fraction']
                 ),
           ',',
           '.'
            )"/>
 </xsl:template>
</xsl:stylesheet>

当将此转换应用于此 XML 文档时:

<span itemprop="price" class="offer_price">
  <span class="currency">\u20ac</span>
16<span class="offer_price_fraction">,95</span>
</span>

对 XPath 表达式求值,并将该求值的结果复制到输出中:

16.95
于 2013-03-02T19:58:43.423 回答
1

这是我设置 XPath 选择器的方式:

>>> hxs.extract()
u'<html><body><span itemprop="price" class="offer_price">\n<span class="currency">\u20ac</span>\n16<span class="offer_price_fraction">,95</span>\n</span></body></html>'

以下是如何达到预期结果:

>>> price = 'descendant::span[@itemprop="price"]'
>>> whole = 'text()'
>>> fract = 'descendant::span[@class="offer_price_fraction"]/text()'
>>> s = hxs.select(price).select('%s | %s' % (whole, fract)).extract()
>>> s
[u'\n', u'\n16', u',95', u'\n']
>>> ''.join(s).strip().replace(',', '.')
u'16.95'
于 2013-03-02T19:22:07.960 回答