假设我有这样的xml(真正的xml更复杂):
<a>
<b>
<c replace="alpha" />
</b>
<d>
<c replace="beta"></c>
</d>
</a>
从我can't use regex开始,我就用BeautifulSoup(lxml)来解析它。现在我用一个字符串替换<c>
,该字符串包含依赖于属性的新的有效xml。这并不难。在
但是我不想用beauthoulsoup解析新的xml。原因是我马上就去粉饰它。有相当多的标记被大量的xml所取代。它不是很高效的解析然后对所有东西进行修饰。在
有没有类似于LiteralXmlPleaseDontParseThisTnx
节点的东西?(我找不到它,他们一定叫它别的名字,还有太多无关的点击“原始html”、“unparsed html”、“literal hmtl”…)。在
或者,有没有一种方法可以对上面的xml进行修饰,然后将新的xml作为纯文本插入其中(而不假设xml是有效的)?在
beauthulsoup用于解析HTML。您所拥有的不是HTML,而是XML,所以您可能不应该使用beauthoulsoup,而应该直接使用lxml。在
lxml元素有一个^{} 方法,但必须传递给它一个元素,而不是字符串。现在还不清楚您要用什么来替换
<c>
,但是如果您从一开始就将替换值作为元素创建,则无需解析即可进行替换。在相反,如果您只想删除一个任意字符串来代替
<c>
,那么,在XML文档上这不是一个格式良好的操作,而且库无法保证您粘贴的内容是格式正确的,因此无法序列化给定的结果。大多数XML库将明确禁止该操作,因为它将违反XML库试图维护的基本假设和保证。在我找到了一种方法来创建同样的结果,这种方法对我很有用,但可能不适用于一般情况。它属于问题的“另类”:在解析过的汤之外进行替换。在
在分析主文档之前对大括号进行转义字符串格式设置:
将
<c replace="alpha" />
替换为替换字符串(对于所有这些字符串):将所有替换项存储在字典中(可能已经是这样):
使用字符串格式进行所有替换:
我承认我的案子有点特别,所以可能对其他人没有帮助。但是在我的例子中,每个
<c>
可以被包含更多<c>
的xml替换,由于多进程通信,每个级别都需要被解析或pickle。(Pickling只比解析快20-50%,并且遇到了硬递归限制)。因此,只需执行一次而不是为每个级别执行此操作可以节省大量时间(在我测试的案例中是系数3),因为regex替换和字符串替换比解析快得多。在相关问题 更多 >
编程相关推荐