xpath标签不确定要放什么

时间:2016-01-09 08:14:50

标签: python xpath scrapy

我有一个页面,我试图降低价格。这是一条线路。

<div itemprop="price" class="js-price-display Price Price--flair Price--medium hide-content-m price-display"> <span class="Price-sup">$</span>34<span class="Price-mark">.</span>96 </div>']

我已经尝试了很多不同的方法来实现它,但不断进展。我得到的最好的是这些2.(顺便说一下价格是34.96美元)

selector.xpath('//div[@itemprop="price"]/text()').extract()

给了我

[u' ', u'34', u' ', u' ', u'34', u'96 ']

这样

selector.xpath('//div[@class="js-price-display Price Price--flair Price--medium hide-content-m price-display"]').extract()

给了我这个结果

[u'<div itemprop="price" class="js-price-display Price Price--flair Price--medium hide-content-m price-display"> <span class="Price-sup">$</span>34<span class="Price-mark">.</span>96 </div>']

如果我得到了跨度,它会给我$和。但我不知道它在实际金额结束时所谓的“之后”的属性(或属性或价值或其他)。我希望得到第一部分,期间和第二部分,但我会采取比我得到的更好的东西。最后,我运行了一些测试代码来查看我放在那里的网页块的属性。这是我跑的

for item in selector.xpath('.//*[@itemprop]'):
     print "Item:", item.xpath('@itemtype').extract()
     for property in item.xpath('.//*[@itemprop]'):
         print "Property:",
         print property.xpath('@itemprop').extract(),
         print property.xpath('string(.)').extract()
         for position, attribute in enumerate(property.xpath('@*'), start=1):
             print "attribute: name=%s; value=%s" % (
                 property.xpath('name(@*[%d])' % position).extract(),
                 attribute.extract())
         print
     print

我得到了这些结果。

C:\Python27\bff\bff\spiders>python test.py
Item: [u'http://schema.org/Offer']
Property: [u'priceCurrency'] [u'']
attribute: name=[u'itemprop']; value=priceCurrency
attribute: name=[u'content']; value=USD

Property: [u'price'] [u' $34.96 ']
attribute: name=[u'itemprop']; value=price
attribute: name=[u'class']; value=js-price-display Price Price--stylized  Price--large hide-content display-inline-m price-display

Property: [u'price'] [u' $34.96 ']
attribute: name=[u'itemprop']; value=price
attribute: name=[u'class']; value=js-price-display Price Price--flair Price--medium hide-content-m price-display

Property: [u'availability'] [u'']
attribute: name=[u'itemprop']; value=availability
attribute: name=[u'itemtype']; value=http://schema.org/ItemAvailability
attribute: name=[u'content']; value=InStock

它是如何像BOOM一样,就像我需要我展示而我无法得到它?我尝试使用这些类和这两个itemprop值,并继续获得类似于我发布的东西。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

尝试

//div[@itemprop='price']//text()

表示你的xpath表达式。请注意text()之前的两个斜杠。这些将导致它进入任何深度并拉出所有文本节点,包括跨度中的节点。

我没有使用scrapy,但如果你的函数只返回一个列表,你应该可以使用

''.join(resultlist)

然后将它们组合成一个表达式。

如果您想尝试获得价格而没有美元符号,您也可以使用

//div[@itemprop='price']/descendant-or-self::*[not(@class='Price-sup')]/text()

只要没有超过div的一个级别,这将有效(不要在这里尝试双斜杠技巧,或者它将与更简单的示例相同,并且无法删除该美元符号的目的)。这抓住的是所有文本节点直接在该div之下,或者在其内部的跨度中(除了美元符号)。您将再次加入您的结果。

另请注意,您在div之前有一个空格。这两种方法都会抓住那个空间,所以你可能需要修剪你的结果。

答案 1 :(得分:2)

通过使用/text(),您只能获得当前上下文元素的直接子节点的文本节点。通过使用//text(),您将获得当前上下文元素中的所有文本节点,直接子项或嵌套项,但是单独的文本将作为单独的文本节点返回。

您需要找到div元素,然后在每个string()上调用XPath div函数,这是您的测试代码输出预期值所做的事情。如果一次只有一个div,那么以下XPath也将起作用:

selector.xpath('string(//div[@itemprop="price"])').extract()

否则,您需要遍历div元素,然后在string()循环体中调用for