使用BeautifulSoup从XML标签中的字符串中移除CRLF
以下是我正在学习用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>