在 scrapy 上正确的 Xpath

Correct Xpath for on scrapy

我只想使用 Xpath

category 获取数据

第 link 页:https://onepagelove.com/3wcc

这是我的输出:

 ['Digital Product', ',', 'Finance', ',', 'Landing Page', ',', 'Thaleah Fat', ',', '23 Feb 2022 by', 'Rob Hope']}

这是网页中的数据示例:

这是我的代码:

from scrapy.http import Request
import scrapy
class PushpaSpider(scrapy.Spider):
    name = 'pushpa'
    
    start_urls = ['https://onepagelove.com/inspiration']
    

    def parse(self, response):
        books = response.xpath("//div[@class='thumb-image']//a//@href").extract()
        for book in books:
            absolute_url = response.urljoin(book)
            yield Request(absolute_url, callback=self.parse_book)

    def parse_book(self, response):
        coordinate = response.xpath("//div[@class='inspo-links']//span[2]//text()").getall()
        coordinate = [i.strip() for i in coordinate]
        # remove empty strings:s
        coordinate = [i for i in coordinate if i]
        yield{
            'category':coordinate
            }
      

该网站在 header 中有多个 inspo-links,因此您正在从许多不同类型的数据中提取。

Xpath 版本:

def parse_book(self, response):
    xpath_coordinate = response.xpath(
        "//span[@class='link-list']")[1].xpath("a/text()").extract()
    yield {
        'category': xpath_coordinate
    }

CSS版本:

def parse_book(self, response):
    content = response.css('div.review-content')
    coordinate = header.css("span.link-list")[1].css("a::text").extract()
    yield {
        'category': coordinate
    }

这里的这个片段只会为您提供类别。

在您的图像示例中,它会给您 ["Experimental", "Informational"]

注意:在您的主要方法中,对于非书籍且没有类别的内容,您会得到一个额外的 link,scrapy 会自动处理错误,因此您仍然可以获得完整的输出。

这是一个 Xpath 示例,它从图像中获取所有 3 种类型的数据:

def parse_book(self, response):
    xpath_coordinate = response.xpath(
        "//span[@class='link-list']")
    features = xpath_coordinate[0].xpath("a/text()").extract()
    category = xpath_coordinate[1].xpath("a/text()").extract()
    typeface = xpath_coordinate[2].xpath("a/text()").extract()
    yield {
        'feature': features,
        'category': category,
        'typeface': typeface
    }