问题描述
我才刚开始接触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:
我不需要答案,但是如果有人能指出我正确的方向,我将不胜感激。
1楼
所有数据似乎都由换行符分隔,因此只需使用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'}
2楼
您可以为要保存的项目定义一个类,然后将其导入蜘蛛。 然后,您可以直接保存项目。