Scrapy spider неправильно очищает данные

#python #python-3.x #web-scraping #scrapy #css-selectors

#python #python-3.x #соскабливание полотна #шершавый #css-селекторы

Вопрос:

Я пытаюсь очистить данные о циркулярах с веб-сайта моего колледжа, используя scrapy для проекта, но мой spider не очищает данные должным образом. Есть много пустых элементов, а также я по какой-то причине не могу очистить атрибуты ‘href’ циркуляров. Я предполагаю, что мои селекторы CSS неверны, но я не могу понять, что именно я делаю неправильно. Я скопировал свои CSS-селекторы, используя расширение Chrome ‘Selector Gadget’. Я пока не изучаю scrapy, так что было бы здорово, если бы вы могли объяснить, что я делал не так.

Веб -сайт, с которого я собираю данные, выглядит следующим образом: https://www.imsnsit.org/imsnsit/notifications.php

Мой код :

 import scrapy
from ..items import CircularItem

class CircularSpider(scrapy.Spider):
    name = "circular"
    start_urls = [
        "https://www.imsnsit.org/imsnsit/notifications.php"
    ]

    def parse(self, response):
        items = CircularItem()
        all = response.css('tr~ tr  tr font')
        for x in all:
            cirName = x.css('a font::text').extract()
            cirLink = x.css('.list-data-focus a').attrib['href'].extract()
            date = x.css('tr~ tr  tr td::text').extract()
            items["Name"] = cirName
            items["href"] = cirLink
            items["Date"] = date
            yield items
 

Ответ №1:

Я изменил вашу функцию обратного вызова parse. Я изменил селекторы CSS на xpath. Кроме того, попробуйте изучить селекторы xpath, они очень мощные и простые в использовании. Как правило, копировать CSS или xpath с использованием автоматических селекторов — плохая идея, потому что в некоторых случаях они могут дать вам неправильные результаты или только один элемент без общего пути.

Прежде всего, я выбираю все tr . Если вы посмотрите внимательно, некоторые из tr них просто пустые, используемые для разделителя. Вы можете отфильтровать их, попытавшись выбрать date , если это None так, вы можете просто пропустить строку. И, наконец, вы можете просто выбрать cirName и cirLink .

Кроме того, разметка данного веб-сайта не очень хороша, и действительно сложно написать правильные селекторы, элементы не имеют много атрибутов, таких как class или id . Это решение, которое я придумал, я знаю, что оно не идеально.

 def parse(self, response):
    items = CircularItem()
    all = response.xpath('//tr') # select all table items
    for x in all:
        date = x.xpath('.//td/font[@size="3"]/text()').get() # filter them by date
        if not date:
            continue
        cirName = x.xpath('.//a/font/text()').get()
        cirLink = x.xpath('.//a[@title="NOTICES / CIRCULARS"]/@href').get()
        items["Name"] = cirName
        items["href"] = cirLink
        items["Date"] = date
        yield items