python新标签替换旧标签_关于python:BeautifulSoup通过原始xml替换标签而无需解析/转义...

说我有这样的xml(真正的xml比较复杂):

我已经用BeautifulSoup(lxml)解析了它,因为我不能使用正则表达式。 现在,我用包含新的有效xml(取决于属性)的字符串替换。 这并不难。

但我想这样做而不用BeautifulSoup解析新的xml。 原因是我会在之后立即美化它。 有相当多的标记已被大量的xml取代。 解析然后美化所有内容的性能不是很高。

是否有类似LiteralXmlPleaseDontParseThisTnx的节点? (我找不到它,他们一定叫它其他东西,并且'raw html','unparsed html','literal hmtl'的相关点击太多了。)

或者,是否有办法美化上面的xml,然后以纯文本的形式插入新的xml(无需对xml进行有效假设)?

看一下lxml。 也许对您有帮助。

BeautifulSoup用于解析HTML。您拥有的不是HTML,而是XML,因此您可能不应该使用BeautifulSoup,而应直接使用lxml。

lxml Element确实具有replace方法,但是必须向其传递一个Element而不是字符串。目前尚不清楚您要用什么替换,但是如果您从一开始就将替换值创建为Element,则无需解析就可以进行替换。

相反,如果您只是想放一个任意字符串代替,那么,这不是对XML文档的格式正确的操作,并且该库也无法保证粘贴的内容格式正确,并且因此,不可能序列化给定的结果。大多数XML库将特别禁止该操作,因为它会违反基本假设并保证XML库正在尝试维护。

我用包含有效xml的字符串替换了(编辑了问题以进行澄清)。 感谢直接使用lxml的提示,我在使用BeautifulSoup时没有遇到麻烦,但是最好使用适当的库。 太糟糕了,可能无法解决性能问题。

我找到了一种创建相同结果的方法,这种方法对我来说很奏效,但可能并不普遍适用。在问题的"替代"类别中:在解析的汤之外进行替换。

解析主文档之前,请使用转义字符串格式化大括号:

escaped = sub(r'({|})', r'\1\1', input)

soup = BeautifulSoup(escaped, 'lxml')  # or lxml

将替换为替换字符串(对于所有字符串):

name = c_tag.attrs['replace']

ctag.replace_with(NavigableString('{' + name + ':s}'))

将所有替换项存储在字典中(可能已经存在):

rep = {'alpha': '', 'beta': 'hi'}

使用字符串格式进行所有替换:

output = soup.prettify().format(**rep)

我承认我的案件有些特殊,因此也许对其他人没有帮助。但是在我的情况下,每个都可以由包含更多的xml代替。由于多进程通信,每个级别都需要解析或腌制。 (腌制仅比解析快20-50%,并达到硬递归限制)。因此只需要执行一次而不是每个级别都可以节省很多时间(在我测试的情况下为3),因为正则表达式替换和字符串替换比解析快得多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值