XPath通常无法选择不存在的内容。这些东西在你的HTML中不存在:
[ 'This is a link', 'This is another link.']
从概念上讲,它们可能存在于更高的抽象级别上,即浏览器对源代码的呈现,但严格来说,即使它们是分开的,例如在颜色和功能上也是如此。
在DOM级别上,只有单独的文本节点,并且XPath可以为你服务。
因此,你有三个选择。
- 选择
text()
节点并在Python
代码中将其各个值连接起来。 - 选择
<li>
元素,然后为每个元素进行评估string(.)
或normalize-space(.)
使用Scrapy
。normalize-space()
将以你期望的方式处理空白。 - 选择
<li>
元素并访问其.text
属性-在内部查找所有后代文本节点并为你加入它们。
就我个人而言,我将使用//ul/li
我的基本XPath表达式作为后者,因为这将导致更简洁的解决方案。
正如@paul在评论中指出的那样,Scrapy提供了一个很好的流利界面,可以在一行代码中执行多个处理步骤。以下代码实现了变体#2:
selector = scrapy.Selector(text='''<ul> <li>This is <a href="#">a link</a></li> <li>This is <a href="#">another link</a>.</li></ul>''')selector.css('ul > li').xpath('normalize-space()').extract()# --> [u'This is a link', u'This is another link.']


