我需要将XML文档转换为LaTeX.类似于

<?xml version="1.0" encoding="UTF-8"?>

<foo>
    12345
    <bar>
        67890
    </bar>
</foo>

\foo{12345\bar{67890}}

如果我这样做了

from bs4 import BeautifulSoup

with open("foobar.xml") as fp:
    soup = BeautifulSoup(fp, 'xml')

for tag in soup.find_all("foo"):
    tag.replaceWith(f"""{tag.text}""")

然后移除内部的标签.如果我使用contents而不是text,它将返回一个列表.

我try 了soup.find('foo').unwrap()个,但它只是删除了标签,没有替换它.

我知道我可以先替换bar,然后再替换foo,但我想要一个不依赖于标签顺序的解决方案.

推荐答案

try 使用递归:

from bs4 import BeautifulSoup, NavigableString, Tag


xml_doc = """\
<?xml version="1.0" encoding="UTF-8"?>
<foo>
    12345
    <bar>
        67890
    </bar>
</foo>"""


def write(tag):
    s = "\\" + tag.name + "{"
    for c in tag.contents:
        if isinstance(c, Tag):
            s += write(c)
        elif isinstance(c, NavigableString):
            s += c.strip()
    return s + "}"


soup = BeautifulSoup(xml_doc, "xml")
print(write(soup.foo))

打印:

\foo{12345\bar{67890}}

Python相关问答推荐

当多个值具有相同模式时返回空

为什么我的Python代码在if-else声明中的行之前执行if-else声明中的行?

如何将双框框列中的成对变成两个新列

如何从具有不同len的列表字典中创建摘要表?

用合并列替换现有列并重命名

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

如何在表中添加重复的列?

mypy无法推断类型参数.List和Iterable的区别

如何保持服务器发送的事件连接活动?

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

Odoo16:模板中使用的docs变量在哪里定义?

使用__json__的 pyramid 在客户端返回意外格式

在电影中向西北方向对齐""

按条件计算将记录拆分成两条记录

使用xlsxWriter在EXCEL中为数据帧的各行上色

在Pandas 中以十六进制显示/打印列?

在不中断格式的情况下在文件的特定部分插入XML标签

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?

如何批量训练样本大小为奇数的神经网络?

Pandas查找给定时间戳之前的最后一个值