鉴于此html:
<ul> <li>This is <a href="#">a link</a></li> <li>This is <a href="#">another link</a>.</li> </ul>
如何使用XPath获得以下结果:
[ 'This is a link', 'This is another link.' ]
我尝试过的
//ul/li/text()
但是,这给了我['This is ', 'This is .'](withoug的文本a标签
['This is ', 'This is .']
也:
string(//ul/li)
但这给了我['This is a link'](所以只有第一个要素)
['This is a link']
也
//ul/li/descendant-or-self::text()
但这给了我 ['This is ', 'a link', 'This is ', 'another link', '.']
['This is ', 'a link', 'This is ', 'another link', '.']
还有其他想法吗?
XPath通常无法选择不存在的内容。这些东西在你的HTML中不存在:
从概念上讲,它们可能存在于更高的抽象级别上,即浏览器对源代码的呈现,但严格来说,即使它们是分开的,例如在颜色和功能上也是如此。
在DOM级别上,只有单独的文本节点,并且XPath可以为你服务。
因此,你有三个选择。
text()
Python
<li>
string(.)
normalize-space(.)
Scrapy
normalize-space()
.text
//ul/li
正如@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.']