代码之家  ›  专栏  ›  技术社区  ›  Dan fatihk

在scrapy中提取类名

  •  7
  • Dan fatihk  · 技术社区  · 6 年前

    我正试图从trustpilot上刮下评级。通用域名格式。

    是否可以使用scrapy提取类名?我正在尝试刮取一个由五个单独图像组成的评级,但图像与评级名称在一个类中,例如,如果评级为2,则开始:

    <div class="star-rating count-2 size-medium clearfix">...
    

    如果是三星,则:

    <div class="star-rating count-3 size-medium clearfix">...
    

    那么,有什么办法可以让我在课堂上擦肩而过吗 count-2 count-3 假设选择器为 .css('.star-rating') ?

    3 回复  |  直到 6 年前
        1
  •  6
  •   Jan    6 年前

    您可以在代码中的某个地方将这两者结合使用:

    import re
    
    classes = response.css('.star-rating').xpath("@class").extract()
    for cls in classes:
        match = re.search(r'\bcount-\d+\b', cls)
        if match:
            print("Class = {}".format(match.group(0))
    
        2
  •  4
  •   gangabass    6 年前

    您可以使用直接提取评级 re_first() re() :

    for rating in response.xpath('//div[contains(@class, "star-rating")]/@class').re(r'count-(\d+)'):
        print(rating)
    
        3
  •  -2
  •   KaizenClaus    6 年前

    我有一个类似的问题。使用scrapy v1.5.1,我可以按名称提取元素的属性。下面是一个在Lowes上使用的示例;我对 class 属性

        for product in response.css('ul.product-cards-grid li.product-wrapper'):
            prod_href = p.css('li::attr(data-producturl)').extract()
            prod_name = p.css('li::attr(data-producttitle)').extract_first()
            prod_img  = p.css('li::attr(data-productimg)').extract_first()
            prod_id   = p.css('li::attr(data-productid)').extract_first()