【问题标题】:Get xpath() to return empty values获取 xpath() 返回空值
【发布时间】:2014-08-19 00:51:30
【问题描述】:

我有很多<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标签(空标签在这里,就是我想要的)。

【问题讨论】:

  • 我不确定这是一个解决方法,我认为这是你必须做的。您正在区分&lt;b/&gt;&lt;b&gt;&lt;/b&gt;,而XML 没有用于区分的语义。空元素b 存在,但在任何一种情况下都没有匿名文本节点子节点。
  • 很难搜索证明某些东西不存在的文档。 :(

标签: python html xpath web-scraping scrapy


【解决方案1】:

这是可以手动剥离标签并获取文本的地方。可以使用w3lib提供的remove_tags()函数:

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

请注意,w3libScrapy dependency 并在内部使用。无需单独安装。

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

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)) 

【讨论】:

  • 这是一个比我做的更优雅的解决方案,谢谢。
  • 全 XPath 解决方案将是 [e.xpath('string()').extract()[0] for e in sel.xpath('//b')]
  • 所有元素 = [e.root.text or 'size-not-found' for e in sel.xpath('.//b')]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2011-09-05
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多