#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