【问题标题】:Struggle to find correct html-tags [closed]努力寻找正确的html标签[关闭]
【发布时间】:2020-07-29 12:55:56
【问题描述】:

任务

编写一个爬虫,在 .csv 中输出:标题、Artikelnummer、价格、交付状态

https://www.karton.eu/einwellig-ab-100-mm

问题 真的很难弄清楚,该网页上的哪个 html-tag 包含我需要的信息。 例如:<small>Artikelnummer: 001</small> 我如何收集 001? 还有几个标签,我不太清楚获取的信息

【问题讨论】:

    标签: python python-3.x xpath web-scraping scrapy


    【解决方案1】:

    首先,您将选择您想要的文本所在的节点:

    response.xpath('//div[@class="delivery-status"]/small/text()')
    

    现在,要仅捕获部分回报,您可以使用正则表达式。幸运的是 Scrapy selectors 支持内置正则表达式。所以你可以这样使用:

    response.xpath('//div[@class="delivery-status"]/small/text()').re_first(r'\d+')
    

    或包含所有结果的列表:

    response.xpath('//div[@class="delivery-status"]/small/text()').re(r'\d+')
    

    【讨论】:

    • 在运行response.xpath('//div[@class="delivery-status"]/small/text()').re_first(r'\d+') 后,我收到以下错误消息:AttributeError: 'str' object has no attribute 're_first' 尽管我导入了“re”
    • 你不需要import re,因为这是来自 Scrapy 的方法,而不是来自 re 模块。您确定您使用的是确切的代码行吗?因为从错误来看,您似乎在.re_first() 之前使用了.get()。 get 方法将返回一个 str 并导致 AttributeError,因为您需要一个 Scrapy 选择器才能使用 re_first 方法。
    • 哦该死的,你完全正确!非常感谢:)
    【解决方案2】:

    每个 ArtikelNummer 都在

    response.xpath('//div[@class="delivery-status"]/small/text()')
    

    是他们坐的地方。您可能会对 <div class="signal_image status-2"> <i> 感到困惑,它位于具有类交付状态的 div 的下游。

    根据 HTML 的结构,您可能希望选择每张卡片并执行类似的操作。

    card = response.xpath('//div[@class="text-center artikelbox"]')
    for a in card:
        a.xpath('.//div[@class="delivery-status"]/small/text()').re_first(r'\d+')
    

    这里的正则表达式\d+ 仅按顺序搜索数字。我们使用 r'' 是因为 \ 是一个转义字符,它在字符串中时无法识别,但使用 r 我们将字符串视为原始字符串并且它可以识别 \ 字符。

    正则表达式是获取文本特定部分的好方法,这些部分比字符串方法可以为您做的更复杂。对它有一个粗略的了解很有用,这样您就可以尝试一些基本的知识并了解如何获得您想要的东西。

    资源

    Regex and digits

    Re Module | Python Module of the Week

    Community StackOverflow Answer for Regex

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多