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

2024-03-29 14:56:02 发布

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

下面是我正在学习使用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>;短语内的字符串中删除CRLF,使<;syntax>;和<;/syntax>;位于同一行,同时保留字符串开头的缩进。在

请注意,<;codeblock>;标记在实际XML文件中以多个级别出现。在

我尝试了以下代码:

^{pr2}$

这会删除<;syntax>;标记之间的“\n”,同时也会删除所有子标记(<;variable>;)。在

感谢对此的一些意见。在

我正在学习基本的python自动解析技术。在


Tags: 文件key标记ltgtdataxmlvariable
2条回答

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

输出:

^{pr2}$

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

from bs4 import BeautifulSoup

soup = BeautifulSoup(xml)

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

相关问题 更多 >