【问题标题】:Split comma separated items into list in scrapy将逗号分隔的项目拆分为scrapy中的列表
【发布时间】:2019-09-24 01:24:26
【问题描述】:

问题

我想从以下代码中提取关键字并将它们作为单独的列表项存储在 json 中。

<meta name="keywords" content="keyword1, keyword2, keyword3">

到目前为止,我使用的是以下代码:

'keywords': [i.split(', ') for i in response.xpath('//meta[@name="keywords"]/@content').extract()]

现在结果

这将产生一个如下所示的 json 文件:

keywords:
     0:
        0: keyword1
        1: keyword2
        2: keyword3

或者像这样的原始数据:

{"keywords": [["keyword1", "keyword2", "keyword3"]]}

预期结果

但我需要将它们分开如下:

keywords:
     0:
        0: keyword1
     1:
        0: keyword2
     2:
        0: keyword3

或者输入原始数据:

{"keywords": [["keyword1"], ["keyword2"], ["keyword3"]]}

任何想法如何解决这个问题?*

【问题讨论】:

  • 'keywords': [[[j] for j in i.split(', ')] for i in response.xpath('//meta[@name="keywords"]/@content').extract()] ?

标签: python json scrapy


【解决方案1】:

试试:

>>> from scrapy import Selector
>>> sel = Selector(text="""<meta name="keywords" content="keyword1, keyword2, keyword3">""")
>>> keywords = sel.xpath('//meta[@name="keywords"]/@content').get()
>>> [[i] for i in keywords.split(', ')]
[[u'keyword1'], [u'keyword2'], [u'keyword3']]

或者:

>>> [[[k] for k in i.split(', ')] for i in sel.xpath('//meta[@name="keywords"]/@content').extract()]
[[[u'keyword1'], [u'keyword2'], [u'keyword3']]]

更新:

也许最好在两种情况下拆分逻辑,比如这里:

>>> keywords = []
>>> for i in sel.xpath('//meta[@name="keywords"]/@content').extract():
...     if ',' in i:
...         for k in i.split(','):
...             keywords.append([k.strip()])
...     else:
...         keywords.append([i.strip()])
... 
>>> keywords
[[u'keyword1'], [u'keyword2'], [u'keyword3']]

【讨论】:

  • 就像 Rakesh 的回答一样,很有魅力。谢谢!
  • 我对您的第一种方法有一个后续问题,因为第二种方法实际上最终会导致意外行为(您实际上注意到了 --> 比需要的多一个方括号)。好吧,一些关键字一起存储在一个元标记中,而另一些则单独存储。如果它们分开存放,我只需要使用response.xpath('//meta[@name="keywords"]/@content').extract()。如果没有,我需要你的第一种方法,它可以按预期工作。但是如何在代码中实现呢?就像“如果有一个带有许多关键字的元标记使用方法一,否则使用方法二”。
  • 我用分离的逻辑更新了代码,这应该适用于所有情况。
【解决方案2】:

尝试将代码更改为,

'keywords': [[x] for x in [i.split(', ') for i in response.xpath('//meta[@name="keywords"]/@content').extract()]]

[] 中添加i.split(', ') 将生成单独的数组。

【讨论】:

  • 恐怕它会给[[[u'keyword1', u'keyword2', u'keyword3']]]。他们将在外面,而不是在里面。
  • 它实际上会产生我以前的结果。但我感谢你的时间,谢谢。不过,Rakesh 和 Vezunchik 做对了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多