Python 使用text(),有没有办法用scrapy将空文本转换为“无”
我遇到了一个问题。我正在抓取的网站xml有一些空值,但我需要保留这些值的顺序 样本:Python 使用text(),有没有办法用scrapy将空文本转换为“无”,python,xml,xpath,web-scraping,scrapy,Python,Xml,Xpath,Web Scraping,Scrapy,我遇到了一个问题。我正在抓取的网站xml有一些空值,但我需要保留这些值的顺序 样本: <thedata> <some-item> <value xsi:nil="true"/> <value xsi:nil="true"/> <value xsi:nil="true"/> <value xsi:nil="true"/> <value
<thedata>
<some-item>
<value xsi:nil="true"/>
<value xsi:nil="true"/>
<value xsi:nil="true"/>
<value xsi:nil="true"/>
<value xsi:nil="true"/>
<value>44</value>
<value>32</value>
<value>31</value>
<value xsi:nil="true"/>
<value xsi:nil="true"/>
<value>32</value>
<value>31</value>
<value>34</value>
<value>34</value>
<value>33</value>
</some-item>
</thedata>
这将打印一个仅包含整数值的列表
既然我需要保持顺序,有没有办法告诉scrapy用或无替换任何空值
编辑:
@unutbu:我仍然遇到同样的问题:
item_vals = node.select('some-item/value/text()').extract()
print item_vals
item_vals2 = node.select('some-item/value/text()').extract() or None
print item_vals2
输出:
[u'44',u'32',u'31',u'32',u'31',u'34',u'34',u'33']
[u'44',u'32',u'31',u'32',u'31',u'34',u'34',u'33']
我想要的是:
[None,None,None,None,None,u'44',u'32',u'31',None,None,u'32',u'31',u'34',u'34',u'33']
或者在遇到空值时表示空值的内容。您需要选择所有值节点,然后从每个片段中提取文本(如果有的话):
[txt for item in hxs.select('some-item/value') for txt in item.select('text()').extract() or [u'']]
您需要选择所有值节点,然后从每个片段中提取文本(如果有):
[txt for item in hxs.select('some-item/value') for txt in item.select('text()').extract() or [u'']]
您可以使用以下方法实现此目的:
您可以使用以下方法实现此目的:
谢谢你的建议,但我还是有问题。我更新了我的帖子。对不起,我误解了你的问题。。。答案已相应更改。如果我使用elt.text,我不会得到任何数据。如果我只是打印elt,我会得到这样一个unicode:很抱歉,关于名称空间,我无法让它与XMLFeedSpider一起工作,无论出于什么原因,[elt.extract for…]与node.select.extract做的相同。也就是说,它只是打印出非常感谢的unicode,这确实有效!!我接受这个答案。如果有人有更清楚的答案,我也想知道!谢谢你的建议,但我还是有问题。我更新了我的帖子。对不起,我误解了你的问题。。。答案已相应更改。如果我使用elt.text,我不会得到任何数据。如果我只是打印elt,我会得到这样一个unicode:很抱歉,关于名称空间,我无法让它与XMLFeedSpider一起工作,无论出于什么原因,[elt.extract for…]与node.select.extract做的相同。也就是说,它只是打印出非常感谢的unicode,这确实有效!!我接受这个答案。如果有人有更清楚的答案,我也想知道!
>>> from scrapy.selector import XmlXPathSelector
>>> xml = """<thedata>
... <some-item>
... <value xsi:nil="true"/>
... <value xsi:nil="true"/>
... <value xsi:nil="true"/>
... <value xsi:nil="true"/>
... <value xsi:nil="true"/>
... <value>44</value>
... <value>32</value>
... <value>31</value>
... <value xsi:nil="true"/>
... <value xsi:nil="true"/>
... <value>32</value>
... <value>31</value>
... <value>34</value>
... <value>34</value>
... <value>33</value>
... </some-item>
... </thedata>
... """
>>> xxs = XmlXPathSelector(text=xml)
>>> thedata = xxs.select('some-item/value').select(
... 'concat('
... ' substring(text(), 1, number(text()) * string-length(text())),'
... ' substring("nil", 1, number(not(text())) * string-length("nil")))'
... ).extract()
>>> thedata
[u'nil', u'nil', u'nil', u'nil', u'nil', u'44', u'32', u'31', u'nil', u'nil', u'32', u'31', u'34', u'34', u'33']
>>> map(lambda v: None if v == 'nil' else v, thedata)
[None, None, None, None, None, u'44', u'32', u'31', None, None, u'32', u'31', u'34', u'34', u'33']