etree.findall: «ИЛИ» - поиск?

1

Я хочу найти все определения стилей в файле 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?

Теги:
xpath
lxml
elementtree

1 ответ

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 может работать. Спасибо!
  • 0
    Пожалуйста! Когда я писал, я понял, что ваше выражение findall содержало предикат, который я не знал, что он примет. Я не вернулся, чтобы findall с findall пор, как познакомился с xpath .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню