Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 3, 2012 12:55:51

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по XPath

Привет всем.
Мне необходимо получить текст всех элементов <p> из html-документа.
Функция xpath_text('//p') возвращает только первый абзац. А как вернуть текст всех абзацев?
Спасибо.

Офлайн

#2 Ноя. 3, 2012 18:29:55

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Вопрос по XPath

import lxml.html
>>> doc = lxml.html.fromstring(open('html.htm').read())
>>> p = doc.xpath("//p")
>>> map(lambda x: x.text_content(), p)

Отредактировано adray (Ноя. 3, 2012 18:30:42)

Офлайн

#3 Ноя. 3, 2012 19:42:06

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по XPath

Спасибо. А нет ли более простого решения? Здесь уже пошло функциональное программирование. Может быть есть функция которая вернет не первый узел, а все узлы?

В документации XPath написано: “P” - вернет все элементы P
Но функция xpath_text(“p”) - возвращает ошибку, она работает только с таким аргументом xpath_text(“//p”) и возвращает при этом только первый элемент “p”.

Офлайн

#4 Ноя. 4, 2012 00:38:02

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Вопрос по XPath

tfox
Спасибо. А нет ли более простого решения? Здесь уже пошло функциональное программирование. Может быть есть функция которая вернет не первый узел, а все узлы?В документации XPath написано: “P” - вернет все элементы PНо функция xpath_text(“p”) - возвращает ошибку, она работает только с таким аргументом xpath_text(“//p”) и возвращает при этом только первый элемент “p”.

В документации написано “p” вернет все элементы из текущего контекста, в нашем случае контекст не задан, поэтому он указывается перед “p” - “//” - значит все элементы p от корня документа.

из какой библиотеки функция xpath_text?
Скорее всего она делает тоже самое, что и мой код со следующей заменой:
map(lambda x: x.text(), p)

вариант с doc.xpath(“//p”) лучше, т.к. он возвращает узлы, а не текст.С узлами можно делать что угодно, в том числе выковырять текстовое содержимое методом text_context()


Офлайн

#5 Ноя. 4, 2012 12:12:42

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по XPath

adray
из какой библиотеки функция xpath_text?
Из библиотеки Grab. Сайт библиотеки: http://grablib.org/

Офлайн

#6 Ноя. 4, 2012 12:59:56

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Вопрос по XPath

xpath_list из grab делает тоже самое, что и xpath из lxml.html

Офлайн

#7 Ноя. 4, 2012 13:40:37

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по XPath

adray
xpath_list из grab делает тоже самое, что и xpath из lxml.html
Понял.

Интересно:
xpath_text('//p') - возвращает первый элемент
xpath_text('//p[2]') -возвращает второй элемент
xpath_text('//p[last()]') - возвращает последний элемент
xpath_text('//p[all()]') - жаль, что такой функции просто не существует

Буду использовать функцию map(lambda x: x.text_content(), p) которая соберет текст узлов воедино
Выходит это единственный способ собрать текст всех узлов до кучи

Спасибо.

Отредактировано tfox (Ноя. 4, 2012 13:41:50)

Офлайн

#8 Ноя. 4, 2012 14:29:35

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

Вопрос по XPath

//text()[ancestor::p]

..bw



Отредактировано bw (Ноя. 4, 2012 14:29:58)

Офлайн

#9 Ноя. 4, 2012 15:52:53

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по XPath

bw
//text()[ancestor::p]
есть. это выражение в возвращает все элементы <p>

только функция xpath_list возвращает результат в виде списка юникод строк

[u'1) \u0412 \u0430\u043f\u0442\u0435\u043a\u0435 \u0441\u044b\u0440\u044c\u0435 \u043f\u0440\

Подскажите как преобразовать этот список юникод строк в одну читабельную строку?

Отредактировано tfox (Ноя. 4, 2012 15:54:16)

Офлайн

#10 Ноя. 4, 2012 16:15:50

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

Вопрос по XPath

>>> help(str.join)

..bw



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version