Форум сайта python.su
Добрый день форумчане!!!! Мне просто необходим ваш совет. Уже ноли в кровь сбил в поисках по нету и чтению инглиш документации.
Но так ничего и не понял :(
есть такая прекрасная библиотека html5lib (только создатели пожалели сил и времени на документирование).
есть задача парсить html страницы вытянутые с помощью curl (вытягивать из них ссылки, элементы и их содержимое)
пробовал с помощью beautifilsoup - все получается.
по совету интернет общественности переключился на html5lib и завис.
все бы хорошо, можно использовать данную библиотеку для создания дерева beautifulsoup и работать как и раньше. Вот только моя натура не дает мне покоя. Создатель html5lib недвусмысленно напоминает, что дерево данного типа не будет поддерживаться в дальнейшем, посему вариантом остается lxml.
Вот тут вся и проблема!!! Как решать задачи парсинга html связкой html5lib и lxml. Так ничего внятного из документации по тому же lxml я не понял. Мот у кого есть рабочие примеры??? Или посоветуйте может что-то революционно-продвинутое.
Главный момент здесь - html5lib :)
Офлайн
Абсолютно никаких сложностей у подавляющего большинства, ни html5lib, ни lxml не вызвали, вот все в недоумении и молчат. Нет документации, читаем примеры, нет или недостаточно примеров читаем исходники, только так, полной, исчерпывающей документации никогда не будет. Возможно вы занимаетесь не своим делом, может вам лучше вернуться к PHP?
import urllib2
import html5lib
builder = html5lib.getTreeBuilder('lxml')
parser = html5lib.HTMLParser(builder, namespaceHTMLElements = False)
doc = parser.parse(urllib2.urlopen('http://python.org/').read())
Офлайн
bwBw, приятно что мои вопросы хотя бы у вас вызвали какие-то чувства.
Абсолютно никаких сложностей у подавляющего большинства, ни html5lib, ни lxml не вызвали, вот все в недоумении и молчат. Нет документации, читаем примеры, нет или недостаточно примеров читаем исходники, только так, полной, исчерпывающей документации никогда не будет. Возможно вы занимаетесь не своим делом, может вам лучше вернуться к PHP?
..bw
Офлайн
И все же возвращаясь к теме. Не могу разобраться. Вот пара строчек над которыми уже давно ломаю голову:
import html5lib
f = content #находится текст загруженной ранее страницы
docc = html5lib.parse(f, treebuilder="lxml")
print docc
import html5lib
import lxml.etree as etree
f = content
docc = html5lib.parse(f, treebuilder="lxml")
print etree.tostring(docc)
Офлайн
Вы не совсем правильно понимаете что такое html5lib. Это хреновина которая позволит из кусков невалидного, с точки зрения xml кода, посторить древо документа. Само древо может быть представлено в разных формах. Одной из форм и является lxml.etree. Соответственно html5lib не предоставляет инструментов работы с деревом и курить в вашем случае надо доку lxml.etree.
Офлайн
OOO. Теперь ближе к телу :)
И все же можно увидеть пример рабочего скрипта или хотя бы полурабочего на тему моего последнего вопроса относительно тегов и порядка их извлечения?
А то эту документацию я уже раскурил вдоль и поперек и нифига не понял:
нашел:
| find(…)
| find(self, path)
|
| Finds the first matching subelement, by tag name or path.
и куда мне его присобачить???
docc.find('a')
выдает красивое “None”
Отредактировано (Авг. 10, 2010 16:15:52)
Офлайн
dmnBrestДумать и писать код за вас я могу, но это будет стоить 25$/h. Могу посоветовать разобраться с тем как работают xpath выражения, и как их применять в libxml.
OOO. Теперь ближе к телу :)
И все же можно увидеть пример рабочего скрипта или хотя бы полурабочего на тему моего последнего вопроса относительно тегов и порядка их извлечения?
выдает красивое “None”
Офлайн
Спасибо за предложение, но с кодом я пожалуй как-то сам. А на счет совета по поводу xpath - стоит конечно покопаться, но наверное я оставлю это на потом.
Для решения моих задач вполне хватает beautifulsoup, а lxml это всего лишь дань моему любопытству. Прогрессивный народ голосует в пользу второго, но “почему”, никто об этом не говорит.
Анализируя материал в инете у меня сложилось мнение, что для задач парсинга html библиотека lxml подходит в меньшей мере (больше для xml), чем скажем тот beautifulsoup, только вот этот, второй, давно не поддерживается автором.
Кроме того использование внутренних средств beautifulsoup для разбора невалидного кода тоже далеко не лучший вариант.
Поэтому остается использовать связку html5lib и beautifulsoup, несмотря на грозные предупреждения автора первого продукта о выходе данного метода из моды.
Офлайн
dmnBrestЗря Вы так пренебрежительно к XPATH относитесь :(. Параметр path в функции find как раз таки по правилам XPATH и строится.
А на счет совета по поводу xpath - стоит конечно покопаться, но наверное я оставлю это на потом.
parser = html5lib.HTMLParser(tree=html5lib.getTreeBuilder("lxml"))
dom = parser.parse(content)
find_a = etree.XPath(".//html:a", namespaces={"html": "http://www.w3.org/1999/xhtml"})
for node in find_a(dom):
href = node.get("href")
if href:
print(href)
Офлайн
Все начинает проясняться :))) Спасибо
На beautifulsoup данный код выглядит немного приятнее:
import html5lib
...
f = content
docc = html5lib.parse(f, treebuilder="beautifulsoup")
find_a = docc.findAll('a') # как-то приятнее для глаза
for i in find_a:
print i['href']
Офлайн