我才刚开始对Scrapy有所了解。到目前为止,我已经弄清楚了如何提取网页的相关部分以及如何在网页中进行爬网。
但是,我仍然不确定如何将结果格式化为有意义的表格格式。
当抓取的数据是表格式时,它就足够简单了。但是,有时数据不是。例如this link
我可以使用
访问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:
我不需要答案,但是如果有人能指出我正确的方向,我将不胜感激。
答案 0 :(得分:0)
所有数据似乎都由换行符分隔,因此只需使用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'}
答案 1 :(得分:0)
您可以为要保存的项目定义一个类,然后将其导入蜘蛛。然后,您可以直接保存项目。