获取xpath()以返回空值

Tyl*_*ler 6 html python xpath scrapy web-scraping

我有一个情况,我有很多<b>标签:

<b>12</b>
<b>13</b>
<b>14</b>
<b></b>
<b>121</b>
Run Code Online (Sandbox Code Playgroud)

如您所见,倒数第二个标记为空.我打电话的时候:

sel.xpath('b/text()').extract()
Run Code Online (Sandbox Code Playgroud)

这给了我:

['12', '13', '14', '121']
Run Code Online (Sandbox Code Playgroud)

我想拥有:

['12', '13', '14', '', '121']
Run Code Online (Sandbox Code Playgroud)

有没有办法获得空值?


我目前的工作是致电:

sel.xpath('b').extract()
Run Code Online (Sandbox Code Playgroud)

然后我自己解析每个html标签(空标签在这里,这就是我想要的).

ale*_*cxe 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']
Run Code Online (Sandbox Code Playgroud)

请注意,这w3lib是一个Scrapy 依赖项,在内部使用。无需单独安装。

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

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)) 
Run Code Online (Sandbox Code Playgroud)

  • 所有 XPath 解决方案将是 `[e.xpath('string()').extract()[0] for e in sel.xpath('//b')]` (3认同)