lxml无法正确解析具有多个类的标签

5 投票
3 回答
2219 浏览
提问于 2025-04-17 13:18

我正在尝试用

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"]')

来解析HTML。

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

但是,第一个span标签的类是'cut',可是s3却是空的。而在s2中,当我给出两个类时,它却能返回这个标签。

3 个回答

2

我很确定,在XPath查询中,CSS的数据模型(也就是类名是用空格分开的,放在一个class属性里)并没有被遵循。为了实现你想要的功能,你应该考虑使用CSS选择器(比如,可以通过cssselect来实现)。

8

在XPath中,等于运算符是用来精确匹配左右两边的内容的。如果你想查找某个类,可以使用 contains 函数:

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

不过,它也可以匹配像 cut2 这样的类。

cssselect 是一个处理CSS选择器的库。还有一个叫 pyquery 的包装器,它在Python中模仿了JQuery库的功能。

1

为了避免Scharron提到的cut2问题,你可以在类的前面和后面加上空格。

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

撰写回答