当前位置: 代码迷 >> python >> 格式错误的结果
  详细解决方案

格式错误的结果

热度:14   发布时间:2023-06-19 09:19:07.0

我才刚开始接触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:

我不需要答案,但是如果有人能指出我正确的方向,我将不胜感激。

所有数据似乎都由换行符分隔,因此只需使用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'}

您可以为要保存的项目定义一个类,然后将其导入蜘蛛。 然后,您可以直接保存项目。

  相关解决方案