Найти - Пользователи
Полная версия: Вопрос по XPath
Начало » Python для новичков » Вопрос по XPath
1
tfox
Привет всем.
Мне необходимо получить текст всех элементов <p> из html-документа.
Функция xpath_text('//p') возвращает только первый абзац. А как вернуть текст всех абзацев?
Спасибо.
adray
import lxml.html
>>> doc = lxml.html.fromstring(open('html.htm').read())
>>> p = doc.xpath("//p")
>>> map(lambda x: x.text_content(), p)
tfox
Спасибо. А нет ли более простого решения? Здесь уже пошло функциональное программирование. Может быть есть функция которая вернет не первый узел, а все узлы?

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


tfox
adray
из какой библиотеки функция xpath_text?
Из библиотеки Grab. Сайт библиотеки: http://grablib.org/
adray
xpath_list из grab делает тоже самое, что и xpath из lxml.html
tfox
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) которая соберет текст узлов воедино
Выходит это единственный способ собрать текст всех узлов до кучи

Спасибо.
bw
//text()[ancestor::p]

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

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

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

Подскажите как преобразовать этот список юникод строк в одну читабельную строку?
bw
>>> help(str.join)

..bw
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