5

我正在尝试使用解析 HTML

a = lxml.html.fromstring('<html><body><span class="cut cross">Text of double class</span><span class="cross">Text of single class</span></body></html>')
s1 = a.xpath('.//span[@class="cross"]')
s2 = a.xpath('.//span[@class="cut cross"]')
s3 = a.xpath('.//span[@class="cut"]')

输出:

s1 => [<Element span at 0x7f0a6807a530>]
s2 => [<Element span at 0x7f0a6807a590>]
s3 => []

但是第一个 span 标签的类是“cut”,但 s3 是空的。在 s2 中,当我同时给出两个类时,它会返回标签。

4

3 回答 3

8

XPath 的相等运算符完全匹配右操作数和左操作数。如果要搜索其中一个类,可以使用以下contains功能:

a.xpath('.//span[contains(@class, "cut")]')

但是,它也可以匹配诸如cut2.

cssselect是一个处理 CSS 选择器的库。一个名为pyquery的包装器模仿了 python 中的 JQuery 库。

于 2013-01-21T15:54:51.260 回答
2

我很确定classXPath 查询不遵循 CSS 数据模型(即类是单个属性中的空格分隔值)。为了做你想做的事,你应该看看使用 CSS 选择器(例如,通过cssselect)。

于 2013-01-21T15:49:39.273 回答
1

为了避免 Scharron 带来的 cut2 问题,您可以将空格连接到类的前面和末尾。

a.xpath('.//span[contains(concat(" ", @class, " "), " cut ")]')
于 2013-01-21T20:27:20.537 回答