让xpath()返回空值
我遇到了一种情况,我有很多 <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))