Scrapy: очистка ссылок / якорей размещение по 1 в строке рядом с другим элементом страницы (теги заголовка / теги H1 / etc …)

#python #scrapy

#python #scrapy

Вопрос:

Я пытаюсь создать скрипт, который будет собирать информацию с различных веб-сайтов и экспортировать ее в CSV в указанном формате. Формат.

Я смог заставить все работать, за исключением того, что это не в идеальном формате.

Прямо сейчас это одна строка на страницу, и все ссылки и текст привязки ссылки вложены в список кругов, который создает длинный список в одной ячейке в Excel.

В идеале, чего я пытаюсь достичь, это разделить списки, чтобы сделать их отдельными строками (оранжевыми на прикрепленном изображении) рядом с дублированными версиями отдельных точек данных (серыми на прикрепленном изображении).

Любая помощь будет оценена!!

введите описание изображения здесь

«

 import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import Rule, CrawlSpider


class InseevSpiderSpider(scrapy.spiders.CrawlSpider):
    name = 'ExampleScraper'
    allowed_domains = ['example.com']
    start_urls = ['https://www.example.com/']
    rules = (
        Rule(LinkExtractor(allow_domains=[
             'example.com']), follow=True, callback="parse_item"),
        Rule(LinkExtractor(deny=('.png', ))),

    )

    def parse_item(self, response):
        address = response.url
        count_address = len(address)
        content_type = response.headers['Content-Type']
        status_code = response.status
        title = response.xpath("//title/text()").extract()
        count_title = len(title[0])
        description = response.xpath(
            "//meta[@name='description']/@content").extract_first()
        if description:
            count_description = len(description)
        else:
            count_description = 0
        keywords = response.xpath(
            "//meta[@name='keywords']/@content").extract_first()
        h1 = response.xpath('//h1//text()').extract_first()
        h2 = response.xpath('//h2//text()').extract_first()
        robot = response.xpath(
            "//meta[@name='robots']/@content").extract_first()
        download_time = response.meta['download_latency']
        link_anchor = response.xpath("//a/text()").extract()
        link_href = response.xpath("//a/@href").extract()

        yield {
            'Address': address,
            'Address count': count_address,
            'Content Type': content_type,
            'Status code': status_code,
            'Title': title,
            'Title count': count_title,
            'Meta description': description,
            'Meta description count': count_description,
            'Meta keywords': keywords,
            'H1': h1,
            'H2': h2,
            'Robot': robot,
            'Download time': download_time,
            "Link Anchor": link_anchor,
            "Link @href": link_href
        }
  

«

Ответ №1:

Самый простой способ — написать цикл и получить несколько элементов:

 for anchor, href in zip(link_anchor, link_href):
    yield {
        ...
        "Link Anchor": anchor,
        "Link @href": href
    }