etree.findall: 'OR'查询?

1 投票
1 回答
557 浏览
提问于 2025-04-15 20:29

我想在一个XHTML文件中找到所有的样式表定义,可以用lxml.etree.findall这个方法。这可能很简单,比如说:

elems = tree.findall('link[@rel="stylesheet"]') + tree.findall('style')

但是,CSS样式定义有个问题,就是顺序很重要。例如:

<link rel="stylesheet" type="text/css" href="/media/css/first.css" />
<style>body:{font-size: 10px;}</style>
<link rel="stylesheet" type="text/css" href="/media/css/second.css" />

如果style标签里的内容是在两个link标签的规则之后应用的,那么结果可能和按定义顺序应用的情况完全不同。

那么,我该怎么查找同时包含link[@rel="stylesheet"]style的内容呢?

1 个回答

3

可以使用XPATH来实现:

data = """<link rel="stylesheet" type="text/css" href="/media/css/first.css" />
<style>body:{font-size: 10px;}</style>
<link rel="stylesheet" type="text/css" href="/media/css/second.css" />
"""

from lxml import etree

h = etree.HTML(data)

h.xpath('//link[@rel="stylesheet"]|//style')

[<Element link at 97a007c>,
 <Element style at 97a002c>,
 <Element link at 97a0054>]

撰写回答