Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用text(),有没有办法用scrapy将空文本转换为“无”_Python_Xml_Xpath_Web Scraping_Scrapy - Fatal编程技术网

Python 使用text(),有没有办法用scrapy将空文本转换为“无”

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

我遇到了一个问题。我正在抓取的网站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>
这将打印一个仅包含整数值的列表

既然我需要保持顺序,有没有办法告诉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']