Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 5, 2010 12:12:15

dmnBrest
От:
Зарегистрирован: 2010-08-05
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

HTML5LIB, lxml и HTML прошу помощи

Добрый день форумчане!!!! Мне просто необходим ваш совет. Уже ноли в кровь сбил в поисках по нету и чтению инглиш документации.
Но так ничего и не понял :(

есть такая прекрасная библиотека html5lib (только создатели пожалели сил и времени на документирование).
есть задача парсить html страницы вытянутые с помощью curl (вытягивать из них ссылки, элементы и их содержимое)
пробовал с помощью beautifilsoup - все получается.
по совету интернет общественности переключился на html5lib и завис.

все бы хорошо, можно использовать данную библиотеку для создания дерева beautifulsoup и работать как и раньше. Вот только моя натура не дает мне покоя. Создатель html5lib недвусмысленно напоминает, что дерево данного типа не будет поддерживаться в дальнейшем, посему вариантом остается lxml.

Вот тут вся и проблема!!! Как решать задачи парсинга html связкой html5lib и lxml. Так ничего внятного из документации по тому же lxml я не понял. Мот у кого есть рабочие примеры??? Или посоветуйте может что-то революционно-продвинутое.

Главный момент здесь - html5lib :)



Офлайн

#2 Авг. 5, 2010 18:38:03

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

HTML5LIB, lxml и HTML прошу помощи

Абсолютно никаких сложностей у подавляющего большинства, ни 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())
..bw



Офлайн

#3 Авг. 5, 2010 23:12:53

dmnBrest
От:
Зарегистрирован: 2010-08-05
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

HTML5LIB, lxml и HTML прошу помощи

bw
Абсолютно никаких сложностей у подавляющего большинства, ни html5lib, ни lxml не вызвали, вот все в недоумении и молчат. Нет документации, читаем примеры, нет или недостаточно примеров читаем исходники, только так, полной, исчерпывающей документации никогда не будет. Возможно вы занимаетесь не своим делом, может вам лучше вернуться к PHP?

..bw
Bw, приятно что мои вопросы хотя бы у вас вызвали какие-то чувства.
Буду предельно откровенен раз уж у Нас с вами завязался диалог. На питоне я всего пару недель отроду. Освоить данный язык меня подтолкнула необходимость создания универсального парсера сайтов. Возможностей PHP для этого увы не хватает из-за его скриптовой направленности и ограниченности во времени работы и выделяемых ресурсах. К тому же порядок отображения информации через браузеры с их заморочками сразу оттолкнуло меня в сторону от этого языка. Хотя есть примеры и очень даже удачные по парсингу сайтов. Выбрал я питон, только потому что один авторитетный журнал отвел целый раздел по этому языку с описанием в красках его преимуществ (теперь я понимаю что это сугубо выкупленные разделы на правах рекламы).

но все не так плохо!!! :) Язык питон действительно классная штука и позволяет решать поистине огромный перечень задач. Так что я рад что я с вами и прошу не отсылать лесом к своим болотам!

А по поводу вашего bw ответа. Ваши 5 строчек кода абсолютно не ответили на мой вопрос. Как мне добраться до отдельного элемента и получить его содержимое или изменить его ….

И ИЗВИНИТЕ. Пишу из дома и на домашнем компе только поставил пакеты (без ручного рукоделия). HTML5lib ведет себя по другому :( (без ошибок). Наверное произошел тот случай, BW, с пакетами (установленные вручную/с помощью setuptools), который мы обсудили ранее. Завтра буду на работе все сносить и ставить заново, как положено :(

Возможно причина моих вопросов именно в кривой установке пакетов модулей. Буду исправляться.



Офлайн

#4 Авг. 10, 2010 13:16:29

dmnBrest
От:
Зарегистрирован: 2010-08-05
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

HTML5LIB, lxml и HTML прошу помощи

И все же возвращаясь к теме. Не могу разобраться. Вот пара строчек над которыми уже давно ломаю голову:

import html5lib

f = content #находится текст загруженной ранее страницы
docc = html5lib.parse(f, treebuilder="lxml")

print docc
Выдает : <lxml.etree._ElementTree object at 0x01122648>

Методом долгих манипуляций и подгрузки самого lxml получилось увидеть html страницы:

import html5lib
import lxml.etree as etree

f = content
docc = html5lib.parse(f, treebuilder="lxml")

print etree.tostring(docc)
А КАК ДАЛЬШЕ? КАК ОБРАТИТЬСЯ К ЭЛЕМЕНТУ по id или собрать и вывести все ссылки???
И почему нужно подгружать сам lxml? Разве в html5lib нет всех нужных инструментов чтобы работать с этим деревом???



Офлайн

#5 Авг. 10, 2010 14:11:00

kivsiak
От:
Зарегистрирован: 2007-10-22
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

HTML5LIB, lxml и HTML прошу помощи

Вы не совсем правильно понимаете что такое html5lib. Это хреновина которая позволит из кусков невалидного, с точки зрения xml кода, посторить древо документа. Само древо может быть представлено в разных формах. Одной из форм и является lxml.etree. Соответственно html5lib не предоставляет инструментов работы с деревом и курить в вашем случае надо доку lxml.etree.



Офлайн

#6 Авг. 10, 2010 16:08:43

dmnBrest
От:
Зарегистрирован: 2010-08-05
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

HTML5LIB, lxml и HTML прошу помощи

OOO. Теперь ближе к телу :)

И все же можно увидеть пример рабочего скрипта или хотя бы полурабочего на тему моего последнего вопроса относительно тегов и порядка их извлечения?

А то эту документацию я уже раскурил вдоль и поперек и нифига не понял:
нашел:
| find(…)
| find(self, path)
|
| Finds the first matching subelement, by tag name or path.

и куда мне его присобачить???

docc.find('a')

выдает красивое “None”



Отредактировано (Авг. 10, 2010 16:15:52)

Офлайн

#7 Авг. 10, 2010 16:30:25

kivsiak
От:
Зарегистрирован: 2007-10-22
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

HTML5LIB, lxml и HTML прошу помощи

dmnBrest
OOO. Теперь ближе к телу :)

И все же можно увидеть пример рабочего скрипта или хотя бы полурабочего на тему моего последнего вопроса относительно тегов и порядка их извлечения?

выдает красивое “None”
Думать и писать код за вас я могу, но это будет стоить 25$/h. Могу посоветовать разобраться с тем как работают xpath выражения, и как их применять в libxml.



Офлайн

#8 Авг. 10, 2010 17:22:02

dmnBrest
От:
Зарегистрирован: 2010-08-05
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

HTML5LIB, lxml и HTML прошу помощи

Спасибо за предложение, но с кодом я пожалуй как-то сам. А на счет совета по поводу xpath - стоит конечно покопаться, но наверное я оставлю это на потом.

Для решения моих задач вполне хватает beautifulsoup, а lxml это всего лишь дань моему любопытству. Прогрессивный народ голосует в пользу второго, но “почему”, никто об этом не говорит.
Анализируя материал в инете у меня сложилось мнение, что для задач парсинга html библиотека lxml подходит в меньшей мере (больше для xml), чем скажем тот beautifulsoup, только вот этот, второй, давно не поддерживается автором.
Кроме того использование внутренних средств beautifulsoup для разбора невалидного кода тоже далеко не лучший вариант.

Поэтому остается использовать связку html5lib и beautifulsoup, несмотря на грозные предупреждения автора первого продукта о выходе данного метода из моды.



Офлайн

#9 Авг. 11, 2010 02:44:04

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

HTML5LIB, lxml и HTML прошу помощи

dmnBrest
А на счет совета по поводу xpath - стоит конечно покопаться, но наверное я оставлю это на потом.
Зря Вы так пренебрежительно к XPATH относитесь :(. Параметр path в функции find как раз таки по правилам 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)



Офлайн

#10 Авг. 11, 2010 08:46:00

dmnBrest
От:
Зарегистрирован: 2010-08-05
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

HTML5LIB, lxml и HTML прошу помощи

Все начинает проясняться :))) Спасибо

На beautifulsoup данный код выглядит немного приятнее:

import html5lib

...

f = content
docc = html5lib.parse(f, treebuilder="beautifulsoup")

find_a = docc.findAll('a') # как-то приятнее для глаза
for i in find_a:
print i['href']
Но прелесть lxml и недостаток beautifulsoup заключается в строчке кода:

… namespaces={“html”: "http://www.w3.org/1999/xhtml"} …



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version