让xpath()返回空值

6 投票
1 回答
1878 浏览
提问于 2025-04-18 11:22

我遇到了一种情况,我有很多 <b> 标签:

<b>12</b>
<b>13</b>
<b>14</b>
<b></b>
<b>121</b>

你可以看到,倒数第二个标签是空的。当我调用:

sel.xpath('b/text()').extract()

这给我的结果是:

['12', '13', '14', '121']

我希望得到的是:

['12', '13', '14', '', '121']

有没有办法获取这个空值呢?


我现在的解决办法是调用:

sel.xpath('b').extract()

然后自己逐个解析每个 HTML 标签(空标签在这里,这正是我想要的)。

1 个回答

3

在这里,你可以手动去掉标签,只保留文本。你可以使用remove_tags()这个函数,它是由w3lib提供的。

>>> from w3lib.html import remove_tags
>>> map(remove_tags, sel.xpath('//b').extract())
[u'12', u'13', u'14', u'', u'121']

需要注意的是,w3lib是一个Scrapy的依赖库,它在内部使用,所以你不需要单独安装它。

另外,使用Scrapy的输入和输出处理器会更好。在这里继续使用sel.xpath('b'),并定义一个输入处理器。例如,你可以为Item类的特定Field定义它:

from scrapy.contrib.loader.processor import MapCompose
from scrapy.item import Item, Field
from w3lib.html import remove_tags

class MyItem(Item):
    my_field = Field(input_processor=MapCompose(remove_tags)) 

撰写回答