Как я могу проанализировать HTML с html5lib и запросить проанализированный HTML с XPath?

Я пытаюсь использовать html5lib для парсинга страницы HTML в к чему-то, что я могу запросить с xpath. html5lib имеет близко к нулевой документации, и я провел слишком много времени, пытаясь понять эту проблему. Конечная цель должна вытащить вторую строку таблицы:

<html>
    <table>
        <tr><td>Header</td></tr>
        <tr><td>Want This</td></tr>
    </table>
</html>

так позволяет, пробуют его:

>>> doc = html5lib.parse('<html><table><tr><td>Header</td></tr><tr><td>Want This</td> </tr></table></html>', treebuilder='lxml')
>>> doc
<lxml.etree._ElementTree object at 0x1a1c290>

это выглядит хорошим, позволяет, видят то, что еще мы имеем:

>>> root = doc.getroot()
>>> print(lxml.etree.tostring(root))
<html:html xmlns:html="http://www.w3.org/1999/xhtml"><html:head/><html:body><html:table><html:tbody><html:tr><html:td>Header</html:td></html:tr><html:tr><html:td>Want This</html:td></html:tr></html:tbody></html:table></html:body></html:html>

LOL WUT?

серьезно. Я был планированием использования некоторого xpath для достигания данных, которые я хочу, но это, кажется, не работает. Таким образом, что я могу сделать? Я готов попробовать различные библиотеки и подходы.

17
задан Paul D. Waite 6 December 2010 в 11:33
поделиться

5 ответов

Отсутствие документации Хорошая причина избегать библиотеки IMO, какой бы крутой она ни была. Вы преданы использованию html5lib? Вы смотрели lxml.html ?

Вот способ сделать это с помощью lxml:

from lxml import html
tree = html.fromstring(text)
[td.text for td in tree.xpath("//td")]

Результат:

['Header', 'Want This']
21
ответ дан 30 November 2019 в 11:22
поделиться

Я всегда рекомендую попробовать библиотеку lxml . Он невероятно быстр и имеет множество функций.

Он также поддерживает парсер html5lib, если он вам нужен: html5parser

>>> from lxml.html import fromstring, tostring

>>> html = """
... <html>
...     <table>
...         <tr><td>Header</td></tr>
...         <tr><td>Want This</td></tr>
...     </table>
... </html>
... """
>>> doc = fromstring(html)
>>> tr = doc.cssselect('table tr')[1]
>>> print tostring(tr)
<tr><td>Want This</td></tr>
4
ответ дан 30 November 2019 в 11:22
поделиться

С BeautifulSoup вы можете сделать это с помощью

>>> soup = BeautifulSoup.BeautifulSoup('<html><table><tr><td>Header</td></tr><tr><td>Want This</td></tr></table></html>')
>>> soup.findAll('td')[1].string
u'Want This'
>>> soup.findAll('tr')[1].td.string
u'Want This'

(Очевидно, что это действительно грубый пример, но да.)

2
ответ дан 30 November 2019 в 11:22
поделиться

Я считаю, что вы можете выполнять поиск css по объектам lxml. как так

elements = root.cssselect('div.content')
data = elements[0].text
1
ответ дан 30 November 2019 в 11:22
поделиться

попробуйте использовать jquery. и вы можете получить все элементы. в качестве альтернативы вы можете поместить идентификатор в свою строку и вытащить ее.

1) ... ...

$ ("td") [1] .innerHTML будет тем, что вы хотите

2) ... ...

$ ("# blah" ) .text () будет тем, что вы хотите

-5
ответ дан 30 November 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: