【问题标题】:extract text from div selector with Scrapy使用 Scrapy 从 div 选择器中提取文本
【发布时间】:2019-10-05 16:22:12
【问题描述】:

我正在尝试获取价格文本 potterybarn 在scrapy shell 中。我使用了scrapy shell "https://www.potterybarnkids.com/shop/easter/easter-shop-all-baskets/",然后尝试获取跨度内的价格class="price-state price-sale" 有没有办法提取跨度内的整个文本并进入其中的每个跨度?

我试过了

response.xpath('//span[@class="price-state price-sale"]/text()').extract() 还有response.xpath('//span[@class="price-state price-sale"]//text()')[0].extract()

我需要一种方法来提取选择器天气中的所有文本,它具有内部跨度、div、...

我检查了How can i extract only text in scrapy selector in python,也检查了Scrapy extracting text from div,在这个答案中假设它只包含在那个例子和这个例子中工作的跨度孩子。但是有没有更通用的方法来正确提取子项中的所有文本,因为//text() 不起作用。

【问题讨论】:

  • 我快速浏览了 HTML。看来“价格金额”类的跨度元素是以价格作为内部文本的元素。 “price-state price-sale”类的 span 元素的内部文本为 '\n'。
  • @DMfll 跨度包含 html 格式的文本“Sale $5.99 – $18.99”(包括 \n ...)
  • 是的。我知道了。我正在使用 lxml 查看元素。您会发现,如果您遍历 '/html/body/div[3]/main/div/div[4]/div[2]/ul/li[1]/span/span[2]' 元素的所有后代而不是子元素,您将获得一个 ['\nSale\n', '\n', '$', '5.99', '\n', '$', '18.99'] 数组作为文本项。

标签: python scrapy


【解决方案1】:

我认为有更有效的方法,但以下xpath 可以完成这项工作。 xpath 上的string() 从所有子节点收集文本。

您可以在此帖子Difference between text() and string() 上找到有关string()text() 之间差异的更多信息

prices = [
    r.xpath('string(.)').extract_first() 
    for r in response.xpath('//span[@class="price-state price-sale"]')
]

您可以在结果中看到,每行一个产品。例如,可以使用replace 清理它,或者使用regex 提取价格

>>> prices
['\n\nSale\n\n\n$5.99\n–\n\n$18.99\n', '\n\nSale\n\n\n$6...

其他选项是分两步完成,使用text() 而不是string() 并在join 操作之前清理数据:

>>> prices = []
>>> for r in response.xpath('//span[@class="price-state price-sale"]'):
>>>     price = [p.strip() for p in r.xpath('.//text()').extract() if p.strip()]
>>>     prices.append(' '.join(price))

这种情况下的结果已经被清理了

>>> prices
['Sale $ 5.99 – $ 18.99', 'Sale $ 6.99 – $ 18.99', 'Sale $ 6.99...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多