Результаты форматирования Scrapy - PullRequest
0 голосов
/ 16 сентября 2018

Я только начинаю понимать Scrapy. До сих пор я выяснил, как извлечь соответствующие разделы веб-страницы и сканировать веб-страницы.

Однако я все еще не уверен, как можно отформатировать результаты в значимом табличном формате.

Когда очищенные данные имеют формат таблицы, это достаточно просто. Однако иногда это не так. например эта ссылка

Я могу получить доступ к names, используя

response.xpath('//div[@align="center"]//h3').extract()

Тогда я могу получить доступ к details, используя

response.xpath('//div[@align="center"]//p').extract()

Теперь мне нужно отформатировать данные следующим образом, чтобы я мог сохранить их в файл CSV.

Name: J Speirs Farms Ltd
Herd Prefix:  Pepperstock
Membership No.  7580
Dept. Herd Mark:  UK244821
Membership Type:  Youth
Year Joined:  2006
Address:  Pepsal End Farm, Pepperstock, Luton, Beds
Postcode:  LU1 4LH
Region:  East Midlands
Telephone:  01582450962
Email:
Website:

В идеале, я бы хотел определить structure данных, а затем использовать заполнение в соответствии с собранными данными. Потому что в некоторых случаях некоторые поля недоступны, например, Email: и Website:

Мне не нужен ответ, но я был бы признателен, если бы кто-то указал мне правильное направление.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вы можете определить класс для элементов, которые вы хотите сохранить, и импортировать этот класс вашему пауку. Затем вы можете напрямую сохранить элементы.

0 голосов
/ 17 сентября 2018

Кажется, что все данные разделены переводами строки, поэтому просто используйте str.splitlines():

> names = response.xpath('//div[@align="center"]//a[@name]')
> details = names[0].xpath('following-sibling::p[1]/text()').extract_first().splitlines()
['J Speirs Farms Ltd   ', 'Herd Prefix:  Pepperstock   ', 'Membership No.  7580   ', 'Dept. Herd Mark:  UK244821   ', 'Membership Type:  Youth   ', 'Year Joined:  2006   ', 'Address:  Pepsal End Farm   ', '  Pepperstock   ', '  Luton   ', '  Beds   ', 'Postcode:  LU1 4LH    ', 'Region:  East Midlands   ', 'Telephone:  01582450962   ']
> name = names[0].xpath('@name').extract_first()
'J+Speirs+Farms+Ltd+++'

Теперь вам просто нужно выяснить, как разобрать эти биты в чистый формат:

Некоторые имена разбиты на несколько строк, но вы можете определить и исправить список, проверив, содержат ли члены : или ., если они не принадлежат предыдущему члену, который:

clean_details = [f'Name: {details[0]}']
# first item is name, skip
for d in details[1:]:
    if ':' in d or 'No.' in d:
        clean_details.append(d)
    else:
        clean_details[-1] += d

Наконец, проанализируйте очищенный список данных, который у нас есть:

item = {}
for detail in clean_details:
    values = detail.split(':')
    if len(values) < 2:  # e.g. Membership No.
        values = detail.split('No.')
    if len(values) == 2:  # e.g. telephone: 1337
        label, text = values
        item[label] = text.strip()

>>> pprint(item)
{'Address': 'Pepsal End Farm     Pepperstock     Luton     Beds',
 'Dept. Herd Mark': 'UK244821',
 'Herd Prefix': 'Pepperstock',
 'Membership ': '7580',
 'Membership Type': 'Youth',
 'Name': 'J Speirs Farms Ltd',
 'Postcode': 'LU1 4LH',
 'Region': 'East Midlands',
 'Telephone': '01582450962',
 'Year Joined': '2006'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...