gpt4 book ai didi

html - 带子项的 XPath 文本

转载 作者:行者123 更新时间:2023-11-28 05:19:19 24 4
gpt4 key购买 nike

给定这个 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 .'](没有 a 标签中的文本

还有:

string(//ul/li)

但这给了我['This is a link'](所以只有第一个元素)

还有

//ul/li/descendant-or-self::text()

但这给了我 ['This is ', 'a link', 'This is ', 'another link', '.']

还有什么想法吗?

最佳答案

XPath 通常无法选择不存在的内容。这些东西在你的 HTML 中不存在:

[
'This is a link',
'This is another link.'
]

它们可能在概念上存在于更高的抽象级别,即浏览器对源代码的呈现,但严格来说,即使在那里它们也是独立的,例如在颜色和功能方面。

在 DOM 级别上,只有单独的文本节点,这就是 XPath 可以为您挑选的所有内容。

因此您有三个选择。

  1. 选择 text()节点并在 Python 代码中加入它们各自的值。
  2. 选择 <li>元素并为它们中的每一个计算string(.)normalize-space(.)与抓取。 normalize-space()会按照您期望的方式处理空格。
  3. 选择 <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.']

关于html - 带子项的 XPath 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41101974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com