Как извлечь текстовое содержимое из всех тегов '<t>' внутри тега абзаца, используя xpath - PullRequest
0 голосов
/ 27 апреля 2020

<p>
  <pPr>
    <pStyle val="Table"/>
    <rPr>
      <szCs val="20"/>
    <rPr>
  </pPr>
  <r>
    <t>Reproductive toxicity</t>
  </r>
  <r>
    <rPr>
      <szCs val="20"/>
    </rPr>
    <t>/pregnancy</t>
  </r>
</p>

У меня есть следующий код xml, и мне нужно проанализировать все такие теги p в таблице и получить текстовое содержимое внутри них, используя XPath в l xml python библиотека. Я написал следующий XPath, который идет в таблицу-> первая строка-> последний столбец-> и затем тег p, который я добавил в html фрагмент кода):

'//tbl/tr[1]/tc[last()]/p/r/t/text()'

Но это даст список, содержащий две строки в тегах t как разные элементы списка: ['reproductive toxicity', '/pregnancy'] Мне нужен вывод в виде одной строки: ['reproductive toxicity/pregnancy']

Кто-нибудь может подсказать, как написать XPath для этого?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

Это просто в XPath 2.0+ (который доступен для Python пользователей в продукте Saxon / C): например,

string-join(//tbl/tr[1]/tc[last()]/p//t, '')

Это невозможно сделать напрямую в XPath 1.0 ; вам нужно будет получить набор <t> элементов, а затем объединить их значения на языке хоста.

В вопросах XPath всегда указывайте, какую версию вы используете, поскольку это часто влияет на ответ.

0 голосов
/ 27 апреля 2020

Поскольку вопрос помечен как 'l xml', и вы указали, что может быть несколько тегов p с аналогичной информацией, попробуйте выполнить следующие действия для этого измененного xml с двумя тегами p, и давайте посмотрим, будет ли это это то, что вы ищете:

repro = """
<doc>
  <p>
  <pPr>
    <pStyle val="Table"/>
    <rPr>
      <szCs val="20"/>
    </rPr>    
  </pPr>
  <r>
    <t>Reproductive toxicity</t>
  </r>
  <r>
    <rPr>
      <szCs val="20"/>
    </rPr>
    <t>/pregnancy</t>
  </r>
</p>
    <p>
  <pPr>
    <pStyle val="Table"/>
    <rPr>
      <szCs val="20"/>
    </rPr>    
  </pPr>
  <r>
    <t>Some other toxicity</t>
  </r>
  <r>
    <rPr>
      <szCs val="20"/>
    </rPr>
    <t>/birth</t>
  </r>
</p>
  </doc>
"""
from lxml import etree
doc = etree.fromstring(repro)
targets = doc.xpath('//p')
lsts = []
for target in targets:
    for t in target:
        txt = target.xpath('.//t/text()')
    lsts.append(txt)
for l in lsts:
    print(' '.join(l))

Вывод:

Reproductive toxicity /pregnancy
Some other toxicity /birth
...