Разбор HTML с помощью lxml (тег h3) - PullRequest
1 голос
/ 27 октября 2011

Я пытаюсь разобрать какой-то html, и у меня возникла проблема с этим небольшим html-кодом.

XML:

<div>
    <p><span><a href="../url"></a></span></p>
    <h3 class="header"><a href="../url">Other</a></h3>
    <a href="../url">Other</a><br>
    <a class="aaaaa" href="../url">Indice</a>
    <p></p>               
</div>

code:

import urllib
from lxml import etree
import StringIO
resultado=urllib.urlopen('trozo.html')
html = resultado.read()
parser= etree.HTMLParser()
tree=etree.parse(StringIO.StringIO(html),parser)
xpath='/div/h3'
html_filtrado=tree.xpath(xpath)
print html_filtrado

Когда я печатаю код, он появляется [], и я предполагаю, что это должен быть список с <h3 class="header"><a href="../url">Other</a></h3> в нем.Если бы у меня был этот список, я бы выполнил etree.tostring (html_filtrado), чтобы увидеть <h3 class="header"><a href="../url">Other</a></h3>.

Так как получить этот код?

<h3 class="header"><a href="../url">Other</a></h3>

Или только ../url?какую часть я хочу !!

спасибо

Ответы [ 2 ]

4 голосов
/ 27 октября 2011

Запрос XPath в вашем примере не совсем верен.

Чтобы получить список всех тегов h3 в тегах div, используйте следующее:

elements = tree.xpath('//div/h3')
etree.tostring(elements[0])

Что должно дать:

'<h3 class="header"><a href="../url">Other</a></h3>\n'

Чтобы получить список всех href атрибутов тегов a в тегах h3, вы можете использовать что-то вроде этого:

tree.xpath('//h3/a/@href')

Что дает:

['../url']
3 голосов
/ 27 октября 2011

Дело в том, что etree.HTMLParser (), когда получает HTML, создает полное HTML-дерево DOM.Таким образом, вместо того, что вы намеревались, если вы используете etree.tostring (tree), вы получите

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div>
<p><span><a href="../url"/></span></p>
<h3 class="header"><a href="../url">Other</a></h3>
<a href="../url">Other</a><br/><a class="aaaaa" href="../url">Indice</a>
<p/>               

Итак, правильный xpath будет '/ html / body / div / h3«

...