l xml выражение xpath для выбора всего текста под данным дочерним узлом, включая его дочерние элементы - PullRequest
0 голосов
/ 19 июня 2020

При условии, что у меня есть XML, как показано ниже:

<node1>
    <text title='book'>
       <div chapter='0'>
          <div id='theNode'>
              <p xml:id="40">
               A House that has:
                   <p xml:id="45">- a window;</p>
                   <p xml:id="46">- a door</p>
                   <p xml:id="46">- a door</p>
               its a beuatiful house
               </p>
          </div>
       </div>
    </text>
</node1>

Я хотел бы найти текстовый заголовок и получить весь текст из первого тега p, появляющегося внутри узла книги заголовков текста

пока знаю:

from lxml import etree
XML_tree = etree.fromstring(XML_content,parser=parser)
text = XML_tree.xpath('//text[@title="book"]/div/div/p/text()') 

получает: «Дом, в котором есть прекрасный дом»

Но я хотел бы также весь текст всех возможных детей и великих детей из первых

, появляющихся в основном под

; ищите, а затем ищите первый

и дайте мне весь текст под этим тегом p независимо от вложенности.

псевдокод:

text = XML_tree.xpath('//text[@title="book"]/... any number of nodes.../p/ ....all text under p') 

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Попробуйте использовать string() или normalize-space() ...

from lxml import etree

XML_content = """
<node1>
    <text title='book'>
       <div chapter='0'>
          <div id='theNode'>
              <p xml:id="x40">
               A House that has:
                   <p xml:id="x45">- a window;</p>
                   <p xml:id="x46">- a door</p>
                   <p xml:id="x47">- a door</p>
               its a beuatiful house
               </p>
          </div>
       </div>
    </text>
</node1>
"""

XML_tree = etree.fromstring(XML_content)
text = XML_tree.xpath('string(//text[@title="book"]/div/div/p)')
# text = XML_tree.xpath('normalize-space(//text[@title="book"]/div/div/p)')
print(text)

Вывод с использованием string() ...


               A House that has:
                   - a window;
                   - a door
                   - a door
               its a beuatiful house

Вывод с использованием normalize-space() ...

A House that has: - a window; - a door - a door its a beuatiful house
0 голосов
/ 20 июня 2020

Другой вариант:

XML_tree = etree.fromstring(XML_content)
text = [el.strip() for el in XML_tree.xpath('//text()[ancestor::text[@title="book"]][normalize-space()]')]
print(" ".join(text))
print("\n".join(text))

Вывод:

A House that has: - a window; - a door - a door its a beuatiful house
A House that has:
- a window;
- a door
- a door
its a beuatiful house
...