gpt4 book ai didi

python - CsvItemExporter 的 Scrapy 自定义 CSV header

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:28 28 4
gpt4 key购买 nike

我正在尝试解析 XML 并将其转换为 CSV。棘手的部分是 header 应与第 3 方 CSV 解析器文档中指定的术语完全匹配,并且它在单词之间包含空格,即“项目标题”、“项目描述”等。

由于 Items 在 items.py 中被定义为变量,我无法创建包含空格的 Items,即

Item title = scrapy.Field()

我已经尝试添加到 settings.py 中:

FEED_EXPORT_FIELDS = ["Item title", "Item description"]

它编辑 CVS header ,但在此之后它不再匹配项目,因此它不会将任何数据填充到 .csv 中。

    class MySpider(XMLFeedSpider):
name = 'example'
allowed_domains = ['example.com']
start_urls = ['http://example.com/feed.xml']
itertag = 'item'

def parse_node(self, response, node):
item = FeedItem()
item['id'] = node.xpath('//*[name()="g:id"]/text()').get()
item['title'] = node.xpath('//*[name()="g:title"]/text()').get()
item['description'] = node.xpath('//*[name()="g:description"]/text()').get()

return item

解析器工作正常,我得到了我需要的所有数据。问题仅在于 csv header 。

有没有一种方法可以轻松添加与项目名称不匹配且可以包含少量单词的自定义 header ?

我目前得到的输出:

id, title, description
12345, Lorem Ipsum, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
12346, Quick Fox, The quick brown fox jumps over the lazy dog.

期望的输出应该是这样的:

ID, Item title, Item description
12345, Lorem Ipsum, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
12346, Quick Fox, The quick brown fox jumps over the lazy dog.

测试输入:

<rss>
<channel>
<title>Example</title>
<link>http://www.example.com</link>
<description>Description of Example.com</description>
<item>
<g:id>12345</g:id>
<g:title>Lorem Ipsum</g:title>
<g:description>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</g:description>
</item>
<item>
<g:id>12346</g:id>
<g:title>Quick Fox</g:title>
<g:description>The quick brown fox jumps over the lazy dog.</g:description>
</item>
</channel>
</rss>

这是 items.py 的内容:

import scrapy

class FeedItem(scrapy.Item):
id = scrapy.Field()
title = scrapy.Field()
description = scrapy.Field()
pass

最佳答案

您可以制作自己的 csv 导出器!理想情况下,您可以使用不同的方法扩展当前导出器:

# exporters.py 
from scrapy.exporters import CsvItemExporter

class MyCsvItemExporter(CsvItemExporter):
header_map = {
'description': 'Item Description',
}

def _write_headers_and_set_fields_to_export(self, item):
if not self.include_headers_line:
return
# this is the parent logic taken from parent class
if not self.fields_to_export:
if isinstance(item, dict):
# for dicts try using fields of the first item
self.fields_to_export = list(item.keys())
else:
# use fields declared in Item
self.fields_to_export = list(item.fields.keys())
headers = list(self._build_row(self.fields_to_export))

# here we add our own extra mapping
# map headers to our value
headers = [self.header_map.get(header, header) for header in headers]
self.csv_writer.writerow(headers)

然后在您的设置中激活它:

FEED_EXPORTERS = {
'csv': 'myproject.exporters.MyCsvItemExporter',
}

关于python - CsvItemExporter 的 Scrapy 自定义 CSV header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56289219/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com