使用BeautifulSoup从XML标签中的字符串中移除CRLF

0 投票
2 回答
811 浏览
提问于 2025-04-18 17:47

以下是我正在学习用Python和beautifulsoup解析的一个XML文件的片段。

<xml>
    <codeblock>
    <syntax>configure</syntax>
    <syntax>      context
    local</syntax>
    <syntax>           interface <variable>interface_name</variable></syntax>
    <syntax>                ip
    address <variable>ip_address</variable> <variable>subnet_mask</variable></syntax>
    <syntax>                exit</syntax>
    <syntax>           server
    ftpd</syntax>
    <syntax>           ssh
    key <variable>data</variable>
    length <variable>octets</variable></syntax>
    <syntax>           ssh
    key <variable>data</variable>
    length <variable>octets</variable></syntax>
    <syntax>           ssh
    key <variable>data</variable>
    length <variable>octets</variable></syntax>
</codeblock>
</xml>

我想请教一下,怎么才能把<syntax>标签里的字符串中的换行符去掉,让<syntax>和</syntax>在同一行,同时保留字符串开头的缩进。

请注意,<codeblock>标签在实际的XML文件中出现了多个层级。

我尝试了以下代码:

from bs4 import BeautifulSoup
soup = BeautifulSoup(open(opxmlFilename),'xml')
for tag in soup.find_all('syntax'):
        tag.string = str(tag.text).replace("\n", " ")

虽然这段代码去掉了<syntax>标签之间的换行符,但它也把所有的子标签(<variable>)都去掉了。

希望能得到一些建议。

我是一名技术写作者,正在学习用Python进行XML解析,以便进行一些基本的自动化操作。

2 个回答

0

也许我没有完全理解这个问题,但这样做应该能满足你的需求。如果不行的话,请运行一下看看有什么问题,我们可以一起想办法解决。

from bs4 import BeautifulSoup

soup = BeautifulSoup(xml)

for tag in soup.findAll('syntax'):
    print tag.text.strip()
0

一位来自Python聊天室的好心人提供了一个很好的解决方案,使用了NavigableString,效果非常好:

xml_string="""
    <xml>
        <codeblock>
            <syntax>configure</syntax>
            <syntax>      context
            local</syntax>
            <syntax>           interface <variable>interface_name</variable></syntax>
            <syntax>                ip
            address <variable>ip_address</variable> <variable>subnet_mask</variable></syntax>
            <syntax>                exit</syntax>
            <syntax>           server
            ftpd</syntax>
            <syntax>           ssh
            key <variable>data</variable>
            length <variable>octets</variable></syntax>
            <syntax>           ssh
            key <variable>data</variable>
            length <variable>octets</variable></syntax>
            <syntax>           ssh
            key <variable>data</variable>
            length <variable>octets</variable></syntax>
        </codeblock>
    </xml>
"""

from bs4 import BeautifulSoup
soup = BeautifulSoup(xml_string,"xml")
for syntax in soup.find_all('syntax'):
    new_tag = soup.new_tag('syntax')
    for child in syntax.contents:
        if "\n" in child:
            new_tag.append(child.replace("\n", " "))
        else:
            new_tag.append(child)
    syntax.replace_with(new_tag)

print soup

输出结果:

<xml>
<codeblock>
<syntax>configure</syntax>
<syntax>      context            local</syntax>
<syntax>           interface </syntax>
<syntax>                ip address <variable>ip_address</variable>                <variable>subnet_mask</variable></syntax>
<syntax>                exit</syntax>
<syntax>           server ftpd</syntax>
<syntax>           ssh key <variable>data</variable> <variable>octets</variable>    </syntax>
<syntax>           ssh key <variable>data</variable> <variable>octets</variable>    </syntax>
<syntax>           ssh key <variable>data</variable> <variable>octets</variable></syntax>
</codeblock>
</xml>

撰写回答