Как выбрать только определенный тег и текст, используя xpath? - PullRequest
0 голосов
/ 12 апреля 2011

Например, html block:

<p><b>text1</b> (<span><a href="#1">asdf</a>text2</span>)</p>

Мне нужно выбрать все теги «a», а все остальное должно быть простым текстом, как мы видим в браузере:

result = ["text1", " (", <tag_a>, "text2", ")"]

или что-то в этом роде.

Пробовал:

hxs.select('.//a|text()')

, в этом случае он находит все теги "a", но текст возвращается только от прямых потомков.

Вв то же время:

hxs.select('.//text()|a')

получает все тексты, но теги "a" только от прямых потомков.

UPDATE

    elements = []
    for i in hxs.select('.//node()'):
        try:
            tag_name = i.select('name()').extract()[0]
        except TypeError:
            tag_name = '_text'

        if tag_name == 'a':
            elements.append(i)
        elif tag_name == '_text':
            elements.append(i.extract())

isесть лучший способ?

Ответы [ 3 ]

1 голос
/ 12 апреля 2011

Это то, что вы ищете?

Вы можете удалить теги-потомки из блока, используя etree.strip_tags

from lxml import etree
d = etree.HTML('<html><body><p><b>text1</b> (<span><a href="#1">asdf</a>text2</span>)</p></body></html>')
block = d.xpath('/html/body/p')[0]
# etree.strip_tags apparently takes a list of tags to strip, but it wasn't working for me
for tag in set(x.tag for x in block.iterdescendants() if x.tag != 'a'):
  etree.strip_tags(block,tag)

block.xpath('./text()|a')

Выход:

['text1', ' (', <Element a at fa4a48>, 'text2', ')']
1 голос
/ 13 апреля 2011

Эти относительные выражения XPath:

.//text()|.//a

Или

.//node()[self::text()|self::a]

Значение : все нисходящие текстовые узлы или a элементов из узла контекста.

Примечание : Это зависит от языка хоста или механизма XPath, упорядочен ли этот результат набора узлов по порядку документов или нет.По определению, наборы узлов неупорядочены.

1 голос
/ 12 апреля 2011

Мне кажется, что вы выходите за пределы территории XPath. XPath хорош в выборе вещей из ввода, но не в построении вывода. Разумеется, он был разработан для использования с XSLT, где инструкции XSLT обрабатывают выходную сторону. Я не уверен, что будет эквивалент Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...