lxml没有正确解析具有多个类的标记

时间:2013-01-21 15:45:49

标签: python lxml

我正在尝试使用

解析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中,当我给两个类时,它返回标记。

3 个答案:

答案 0 :(得分:7)

XPaths equal运算符恰好与右侧和左侧操作数匹配。 如果要搜索其中一个类,可以使用contains函数:

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

但是,它也可以匹配cut2等类。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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