Я пытаюсь использовать 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 для достигания данных, которые я хочу, но это, кажется, не работает. Таким образом, что я могу сделать? Я готов попробовать различные библиотеки и подходы.
Отсутствие документации Хорошая причина избегать библиотеки IMO, какой бы крутой она ни была. Вы преданы использованию html5lib? Вы смотрели lxml.html ?
Вот способ сделать это с помощью lxml:
from lxml import html
tree = html.fromstring(text)
[td.text for td in tree.xpath("//td")]
Результат:
['Header', 'Want This']
Я всегда рекомендую попробовать библиотеку 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>
С 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'
(Очевидно, что это действительно грубый пример, но да.)
Я считаю, что вы можете выполнять поиск css по объектам lxml. как так
elements = root.cssselect('div.content')
data = elements[0].text
попробуйте использовать jquery. и вы можете получить все элементы. в качестве альтернативы вы можете поместить идентификатор в свою строку и вытащить ее.
1) ... ...
$ ("td") [1] .innerHTML будет тем, что вы хотите
2) ... ...
$ ("# blah" ) .text () будет тем, что вы хотите