Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 12, 2010 08:46:13

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

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

Спасибо lorien!!!
Поистине полный и понятный ответ.
Буду рыть во втором направлении - xpath.



Офлайн

#2 Авг. 12, 2010 09:45:57

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

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

Нашел очень интересный и понятный материал (на русском) для начала работы с lxml. Может кому будет полезен.

http://ru.wikisource.org/wiki/Погружение_в_Python_3_(Пилгрим)/XML (про саму библиотеку там написано чуть ниже)



Отредактировано (Авг. 12, 2010 10:04:43)

Офлайн

#3 Авг. 12, 2010 10:04:04

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

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

И сразу назрел вопрос!

Как указать lxml дефолтный неймспейс? (eсли я буду работать только с html)

Что-то похожее уже поднималось в нете:
http://softwaremaniacs.org/forum/python/19595/



Офлайн

#4 Авг. 12, 2010 13:11:31

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

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

Угу. Я этот вопрос и подымал. Ответ - никак.
Но вопрос этот возник в контексте работы с html5lib. Посмотрев на исходники обнаружил что проблему с неймспейсами создаю себе сам:

import html5lib
from lxml import etree
tree = html5lib.parse("<a href='aaa'>aaa</a>", treebuilder="lxml")
print etree.tostring(tree.getroot())
и сравнить это с

import html5lib
from lxml import etree
tree = html5lib.parse("<a href='aaa'>aaa</a>", treebuilder="lxml", namespaceHTMLElements=False)
print etree.tostring(tree.getroot())



Офлайн

#5 Авг. 13, 2010 08:43:41

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

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

tree = html5lib.parse(“<a href='aaa'>aaa</a>”, treebuilder=“lxml”, namespaceHTMLElements=False)


!!!!!!!!!!!!!!!! ВОТ ОНО, ТО САМОЕ !!!!!!!!!!!!!!!!
Теперь можно работать с чистым html и не забивать голову всякими xml примочками (префиксами, пространствами имен).

Спасибо, дорогие форумчане! На этот момент у меня вопросы иссякли :) буду творить.

Если кто занимается вопросом парсинга информации в инете, буду рад с вами сотрудничать! Пишите в личку :)



Офлайн

#6 Дек. 7, 2010 21:13:30

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

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

kivsiak
Думать и писать код за вас я могу, но это будет стоить 25$/h. Могу посоветовать разобраться с тем как работают xpath выражения, и как их применять в libxml.
dmnBrest
Для решения моих задач вполне хватает beautifulsoup, а lxml это всего лишь дань моему любопытству. Прогрессивный народ голосует в пользу второго, но “почему”, никто об этом не говорит.
Все сходится - чем меньше документации и больше надо трахаться, тем больше цена человека, который умеет с ним работать, ну а каждый хочет набить себе цену :)

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

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

Есть еще вопрос по lxml+html5, предположим, я нашел нужный элемент, а как вывести его путь от корня? В доках нихрена не понятно + они еще и устаревшие (http://codespeak.net/lxml/api/lxml.etree._ElementTree-class.html getpath() и getroot() у меня нет, да и etree.tostring() вместо str(elem) тоже решение спорное).



Офлайн

#7 Дек. 8, 2010 11:21:59

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

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

asilyator
dmnBrest
Поэтому остается использовать связку html5lib и beautifulsoup, несмотря на грозные предупреждения автора первого продукта о выходе данного метода из моды.
о_О а это как?
от Beautifulsoup я отказался :) в последних сообщениях было найдено решение и оно меня вполне удовлетворяет.
Напомню. Я искал возможность разбора html и получения информации из отдельных элементов (тегов). Что-то на подобии jQuery для javascript (поклонником которого я являюсь). Там очень мощный механизм обращения к отдельным элементам. Вот это мне и нужно было только от Python. Решение найдено и пока вполне мне нравится :)
        tree = html5lib.parse(data, treebuilder="lxml",  namespaceHTMLElements=False)
root = tree.getroot()
xpath_abr="//p[contains(., 'ключевое слово') and string-length(text())>'50']" # поиск в тексте абзацев содержащих "ключевое слово" и длиной более 50 символов (и так далее, все зависит от фантазии и знания xpath)
xpath_me = etree.XPath(xpath_abr.decode('utf8'))
nodes = xpath_me(root)

for node in nodes:
if node.text is None: node.text = ''
print etree.tounicode(node).encode('utf8');
asilyator
Есть еще вопрос по lxml+html5, предположим, я нашел нужный элемент, а как вывести его путь от корня? В доках нихрена не понятно + они еще и устаревшие (http://codespeak.net/lxml/api/lxml.etree._ElementTree-class.html getpath() и getroot() у меня нет, да и etree.tostring() вместо str(elem) тоже решение спорное).
не понял про “…getpath() и getroot() у меня нет…”
но я вижу ответ на ваш вопрос в следующем:

    import html5lib
from lxml import etree

tree = html5lib.parse(page, treebuilder="lxml", namespaceHTMLElements=False) #PAGE - html текст страницы
root = tree.getroot()
xpath_abr="//a"
xpath_me = etree.XPath(xpath_abr.decode('utf8'))
nodes = xpath_me(root)

for node in nodes:
print tree.getpath(node)
/html/body/div[2]/div/div[1]/div/a
/html/body/div[2]/div/div[2]/ul/li[1]/a
/html/body/div[2]/div/div[2]/ul/li[2]/a
/html/body/div[2]/div/div[2]/ul/li[3]/a
/html/body/div[2]/div/div[2]/ul/li[4]/a
/html/body/div[2]/div/div[2]/ul/li[5]/a
/html/body/div[2]/div/div[2]/ul/li[6]/a
/html/body/div[2]/div/div[3]/div/div[2]/div[1]/div[2]/h1/a
/html/body/div[2]/div/div[3]/div/div[2]/div[1]/div[2]/div/a
/html/body/div[2]/div/div[3]/div/div[2]/div[1]/div[3]/div/p[1]/a[1]
/html/body/div[2]/div/div[3]/div/div[2]/div[1]/div[3]/div/p[1]/a[2]
/html/body/div[2]/div/div[3]/div/div[2]/div[1]/div[3]/div/p[1]/a[3]
...



Офлайн

#8 Март 31, 2011 01:03:34

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

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

А в lxml есть getElementById? Я уже свой велосипед изобрел.



Офлайн

#9 Март 31, 2011 07:44:08

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

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

>>> doc.xpath('//*[@id="mail"]')
[<Element li at 3061d08>]



Офлайн

#10 Март 31, 2011 20:27:53

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

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

А подробные доки по xpath есть?



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version