Элементы обертки Python lxml - PullRequest
6 голосов
/ 18 мая 2011

Мне было интересно, как проще всего обернуть элемент другим элементом, используя lxml и Python, например, если у меня есть фрагмент HTML:

<h1>The cool title</h1>
<p>Something Neat</p>
<table>
<tr>
<td>aaa</td>
<td>bbb</td>
</tr>
</table>
<p>The end of the snippet</p>

И я хочу обернуть элемент таблицы следующим элементом:

<h1>The cool title</h1>
<p>Something Neat</p>
<section>
<table>
<tr>
<td>aaa</td>
<td>bbb</td>
</tr>
</table>
</section>
<p>The end of the snippet</p>

Еще одна вещь, которую я хотел бы сделать, это просмотреть документ XML для h1s с определенным атрибутом, а затем обернуть все элементы до следующего тега h1 в элементе, например:

<h1 class='neat'>Subject 1</h1>
<p>Here is a bunch of boring text</p>
<h2>Minor Heading</h2>
<p>Here is some more</p>
<h1 class='neat>Subject 2</h1>
<p>And Even More</p>

Преобразовано в:

<section>
<h1 class='neat'>Subject 1</h1>
<p>Here is a bunch of boring text</p>
<h2>Minor Heading</h2>
<p>Here is some more</p>
</section>
<section>
<h1 class='neat>Subject 2</h1>
<p>And Even More</p>
</section>

Спасибо за помощь, Chris

Ответы [ 2 ]

5 голосов
/ 18 мая 2011

lxml отлично подходит для анализа правильно сформированного xml, но не так хорош, если у вас есть не-xhtml html. Если это так, тогда перейдите на BeautifulSoup в соответствии с рекомендациями системного администратора.

С помощью lxml это довольно простой способ вставить раздел вокруг всех таблиц в документе:

import lxml.etree

TEST="<html><h1>...</html>"

def insert_section(root):
    tables = root.findall(".//table")
    for table in tables:
        section = ET.Element("section")
        table.addprevious(section)
        section.insert(0, table)   # this moves the table

root = ET.fromstring(TEST)
insert_section(root)
print ET.tostring(root)

Вы можете сделать что-то похожее, чтобы обернуть заголовки, но вам нужно будет перебрать все элементы, которые вы хотите обернуть, и переместить их в раздел. Здесь могут помочь element.index (child) и кусочки списка.

0 голосов
/ 18 мая 2011

Если вы анализируете определенные xml-файлы, вы можете использовать BeautifulSoup http://www.crummy.com/software/BeautifulSoup/

Beautiful Soup - отличный способ представить xml как объект python.Затем вы можете написать объекты Python для анализа HTML и добавления / удаления тегов.Поэтому у вас может быть функция is_h1, которая найдет все теги в XML-файле.Затем вы можете добавить тег раздела с помощью красивого супа.

Если вы хотите вернуть это в браузер, вы можете использовать HttpResponse с аргументом, представляющим собой строковое представление готового продукта XML.

...