我有一个页面,我试图降低价格。这是一条线路。
<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值,并继续获得类似于我发布的东西。在此先感谢您的帮助。
答案 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
。