2010-03-16 63 views
1

我想用lxml.etree.findall在XHTML文件中找到所有样式表定义。这可能很简单etree.findall:'OR'-lookup?

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

回答

2

可能使用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>] 
+0

好笑,我试图以'tree.findall'表达,它没有发生,我认为'tree.xpath'可以工作。谢谢! – 2010-03-16 11:37:04

+0

不客气!在我写作时,我意识到你的'findall'表达式包含一个谓词,我不知道它会接受。自从熟悉'xpath'后,我一直没有回到'findall'。 – MattH 2010-03-16 11:43:53