在Python中使用LXML解析<p>标记

2024-04-28 19:25:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python3.5中的LXML解析TEI-XML文件。出于某种原因,我不明白,解析器会在有嵌套标记的地方中断<p>标记内容。你知道吗

这是我的密码:

from lxml import etree
namespaces = {'tei':'http://www.tei-c.org/ns/1.0'}
xp_p = "//tei:body//tei:p//text()"
tree = etree.parse("data/sorb.xml")
paragraphs = tree.xpath(xp_p, namespaces=namespaces)
for par in paragraphs:
    print(par)

例如,如果XML文件中有一个<p>,如下所示:

<p xml:id="b1d3qun-cdtvet">
  <lb ed="#S"/>Circa distinctionem 3m quaero utrum mens humana
  <lb ed="#S"/>sit <choice><orig>ymago</orig><reg>imago</reg></choice> trinitatis increatae <choice><orig>sicud</orig><reg>sicut</reg></choice> in rebus a<lb ed="#S"/>liis factis propter hominem est vestigium eiusdem tri<lb ed="#S"/>nitatis
</p>

我的剧本打破了它的内容:

Circa distinctionem 3m quaero utrum mens humana

sit 
ymago
imago
 trinitatis increatae 
sicud
sicut
 in rebus a
liis
                factis propter hominem est vestigium eiusdem tri
nitatis

然而,我想得到整个<p>,因此:

Circa distinctionem 3m quaero utrum mens humana sit ymago imago trinitatis increatae sicud sicut in rebus a liis factis propter hominem est vestigium eiusdem tri nitatis

我的问题的第一部分是,发生了什么,我该如何解决我的问题?你知道吗

我的问题的第二部分是,我怎样才能得到另一个结果?你知道吗

大约3米宽的人坐在三位一体的椅子上,增加了支撑人和三位一体遗迹的自然力

(即<p>的全部内容)?你知道吗


Tags: inteiregoriglbchoicesited
1条回答
网友
1楼 · 发布于 2024-04-28 19:25:10

Part 1 of my question is, What's going on, and how can I solve my problem?

xpath表达式显式请求文本节点:

 //tei:body//tei:p//text()

因此,返回的是<p>元素中包含的文本节点列表。你知道吗

Part 2 of my question would be, how can I get this other result?

您可能希望迭代<p>元素本身,而不是文本节点:

xp_p = "//tei:body//tei:p"

然后在循环中,使用xpathstring函数:

for par in paragraphs:
  text = par.xpath('string(.)')

这会给你:

'\n  Circa distinctionem 3m quaero utrum mens humana\n  sit ymagoimago trinitatis increatae sicudsicut in rebus aliis factis propter hominem est vestigium eiusdem trinitatis\n'

你可以得到类似的结果:

text = ' '.join(x.strip() for x in par.xpath('.//text()'))

…这样做的好处是可以将所有换行符转换为空格,因此您将得到:

' Circa distinctionem 3m quaero utrum mens humana sit ymago imago trinitatis increatae sicud sicut in rebus a liis factis propter hominem est vestigium eiusdem tri nitatis'

如果您想要的不是文本而是<p>元素中包含的整个HTML内容,请参见this answer。解决方案如下所示:

innerhtml = ''.join(etree.tostring(child) for child in par.iterdescendants())

结果是:

'<lb xmlns="http://www.tei-c.org/ns/1.0" ed="#S"/>Circa distinctionem 3m quaero utrum mens humana\n  <lb xmlns="http://www.tei-c.org/ns/1.0" ed="#S"/>sit <choice xmlns="http://www.tei-c.org/ns/1.0"><orig>ymago</orig><reg>imago</reg></choice> trinitatis increatae <orig xmlns="http://www.tei-c.org/ns/1.0">ymago</orig><reg xmlns="http://www.tei-c.org/ns/1.0">imago</reg><choice xmlns="http://www.tei-c.org/ns/1.0"><orig>sicud</orig><reg>sicut</reg></choice> in rebus a<orig xmlns="http://www.tei-c.org/ns/1.0">sicud</orig><reg xmlns="http://www.tei-c.org/ns/1.0">sicut</reg><lb xmlns="http://www.tei-c.org/ns/1.0" ed="#S"/>liis factis propter hominem est vestigium eiusdem tri<lb xmlns="http://www.tei-c.org/ns/1.0" ed="#S"/>nitatis\n'

相关问题 更多 >