使用BeautifulSoup从XML标记中的字符串中删除CRLF

时间:2014-08-19 11:10:16

标签: python xml beautifulsoup

以下是我正在学习使用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>

我想就如何从&lt; syntax&gt;中的字符串中删除CRLF提出一些建议。短语要有&lt; syntax&gt;和&lt; / syntax&gt;在同一行中,同时保留字符串开头的缩进。

请注意&lt; codeblock&gt;标记出现在实际XML文件的多个级别中。

我尝试了以下代码:

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

虽然这会删除&lt; syntax&gt;之间的'\ n'。 tag,它还会删除所有子标记(&lt; variable&gt;)。

赞赏一些投入。

我是一名技术作家,他正在尝试使用python学习XML解析以进行基本的自动化活动。

2 个答案:

答案 0 :(得分:0)

也许我不完全理解这个问题,但这不会给你带来你想要的东西。如果没有,请运行它,看看有什么不对,我们可以尝试解决这个问题。

from bs4 import BeautifulSoup

soup = BeautifulSoup(xml)

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

答案 1 :(得分:0)

来自python IRC页面的一位优秀绅士帮助使用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>