Найти - Пользователи
Полная версия: HTML5LIB, lxml и HTML прошу помощи
Начало » Web » HTML5LIB, lxml и HTML прошу помощи
1 2 3
dmnBrest
Спасибо lorien!!!
Поистине полный и понятный ответ.
Буду рыть во втором направлении - xpath.
dmnBrest
Нашел очень интересный и понятный материал (на русском) для начала работы с lxml. Может кому будет полезен.

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

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

Что-то похожее уже поднималось в нете:
http://softwaremaniacs.org/forum/python/19595/
kivsiak
Угу. Я этот вопрос и подымал. Ответ - никак.
Но вопрос этот возник в контексте работы с 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())
dmnBrest
tree = html5lib.parse(“<a href='aaa'>aaa</a>”, treebuilder=“lxml”, namespaceHTMLElements=False)


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

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

Если кто занимается вопросом парсинга информации в инете, буду рад с вами сотрудничать! Пишите в личку :)
asilyator
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) тоже решение спорное).
dmnBrest
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]
...
asilyator
А в lxml есть getElementById? Я уже свой велосипед изобрел.
Александр Кошелев
>>> doc.xpath('//*[@id="mail"]')
[<Element li at 3061d08>]
asilyator
А подробные доки по xpath есть?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB