Передача выражения xpath в результат xpath - PullRequest
0 голосов
/ 28 августа 2018

Я изо всех сил пытаюсь понять части библиотеки lxml для python.

Возьмите следующий HTML-файл, sample.html .

<div class="team">
    <ul class="team-members">
        <li class="team-member">
                <span class="team-member-name">John Doe</span>
                <span class="team-member-age">30</span>
            </li>
        <li class="team-member">
                <span class="team-member-name">Jane Doe</span>
                <span class="team-member-age">32</span>
            </li>
        </ul>
    </div>
<div class="team">
    <ul class="team-members">
        <li class="team-member">
                <span class="team-member-name">Joe Smith</span>
                <span class="team-member-age">28</span>
            </li>
        <li class="team-member">
                <span class="team-member-name">Jill Smith</span>
                <span class="team-member-age">41</span>
            </li>
        </ul>
    </div>

Я могу импортировать этот html в дерево lxml:

from lxml import html

file = open("sample.html",'r')
sample = file.read()

tree = html.fromstring(sample)

Затем я могу использовать xpath, чтобы получить список всех атомов текста в html, например:

tree.xpath('//text()')

Моя проблема возникает, когда я передаю xpath, как показано ниже:

elements = tree.xpath("//li")

Печатные элементы дают

[<Element li at 0x48be638>,
 <Element li at 0x48be9f8>,
 <Element li at 0x48beb88>,
 <Element li at 0x48bec78>]

Я могу передать xpath каждому из них, но каждый ведет себя так же, как и оригинальное дерево! Так, например,

elements[0].xpath('//text()')

, кажется, возвращает точно такой же список, как указано выше Однако

elements[0].tag

возвращает 'li', поэтому каждый элемент имеет некоторую запись о том, откуда он взялся.

Вопрос: В идеале я хотел бы иметь возможность получить доступ к каждому члену списка в html-документе по отдельности и передать каждому xpath. Возможно ли что-то подобное? Какую информацию на самом деле содержит каждый «Элемент li»?

1 Ответ

0 голосов
/ 28 августа 2018

elements[0].xpath('//text()') возвращает все текстовые узлы в заданном HTML DOM. Чтобы получить текстовые узлы-потомки elements[0], вам нужно запустить XPath с точкой ( контекстный узел ):

elements[0].xpath('.//text()')
...