Извлечение данных из нескольких таблиц с помощью Scrapy с использованием xpath - PullRequest
0 голосов
/ 25 апреля 2019

Я извлекаю метаданные и URL-адреса из 12 таблиц на веб-странице, и, хотя у меня это работает, я довольно плохо знаком с xpath и scrapy, так есть ли более краткий способ, которым я мог бы сделать это?

Первоначально я получал множество дубликатов, когда я пробовал различные пути xpath и понял, что каждая строка таблицы повторяется для каждой таблицы.Мое решение этого состояло в том, чтобы перечислять таблицы и проходить по каждой, собирая строки только для этой таблицы.Чувствуется, что, возможно, есть более простой способ сделать это, но я не уверен сейчас.

import scrapy

class LinkCheckerSpider(scrapy.Spider):
    name = 'foodstandardsagency'
    allowed_domains = ['ratings.food.gov.uk']
    start_urls = ['https://ratings.food.gov.uk/open-data/en-gb/']

    def parse(self, response):

        print(response.url)
        tables = response.xpath('//*[@id="openDataStatic"]//table')

        num_tables = len(tables)

        for tabno in range(num_tables):

            search_path = '// *[ @ id = "openDataStatic"] / table[%d] /  tr'%tabno

            rows = response.xpath(search_path)


            for row in rows:
                local_authority = row.xpath('td[1]//text()').extract()
                last_update = row.xpath('td[2]//text()').extract()
                num_businesses = row.xpath('td[3]//text()').extract()
                xml_file_descr = row.xpath('td[4]//text()').extract()
                xml_file = row.xpath('td[4]/a/@href').extract()

                yield {'local_authority': local_authority[1],
                      'last_update':last_update[1],
                      'num_businesses':num_businesses[1],
                      'xml_file':xml_file[0],
                      'xml_file_descr':xml_file_descr[1]
                        }

'' '

И я запускаю его с

scrapy runspider fsa_xpath.py

1 Ответ

2 голосов
/ 25 апреля 2019

Вы можете выполнить итерацию, хотя селекторы таблиц, возвращаемые вашим первым xpath:

tables = response.xpath('//*[@id="openDataStatic"]//table')
for table in tables:
    for row in table.xpath('./tr'):
        local_authority = row.xpath('td[1]//text()').extract()

Вы сделали это со строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...