BeautifulGroup用原始xml替换标记,而无需解析/转义

2024-09-30 14:15:24 发布

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

假设我有这样的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是有效的)?在


Tags: 字符串alpha属性usehtml原因xmlcan
2条回答

beauthulsoup用于解析HTML。您所拥有的不是HTML,而是XML,所以您可能不应该使用beauthoulsoup,而应该直接使用lxml。在

lxml元素有一个^{}方法,但必须传递给它一个元素,而不是字符串。现在还不清楚您要用什么来替换<c>,但是如果您从一开始就将替换值作为元素创建,则无需解析即可进行替换。在

相反,如果您只想删除一个任意字符串来代替<c>,那么,在XML文档上这不是一个格式良好的操作,而且库无法保证您粘贴的内容是格式正确的,因此无法序列化给定的结果。大多数XML库将明确禁止该操作,因为它将违反XML库试图维护的基本假设和保证。在

我找到了一种方法来创建同样的结果,这种方法对我很有用,但可能不适用于一般情况。它属于问题的“另类”:在解析过的汤之外进行替换。在

  • 在分析主文档之前对大括号进行转义字符串格式设置:

    escaped = sub(r'({|})', r'\1\1', input)
    soup = BeautifulSoup(escaped, 'lxml')  # or lxml
    
  • <c replace="alpha" />替换为替换字符串(对于所有这些字符串):

    name = c_tag.attrs['replace']
    ctag.replace_with(NavigableString('{' + name + ':s}'))
    
  • 将所有替换项存储在字典中(可能已经是这样):

    rep = {'alpha': '<lots /><of-xml />', 'beta': '<b>hi</b>'}
    
  • 使用字符串格式进行所有替换:

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

我承认我的案子有点特别,所以可能对其他人没有帮助。但是在我的例子中,每个<c>可以被包含更多<c>的xml替换,由于多进程通信,每个级别都需要被解析或pickle。(Pickling只比解析快20-50%,并且遇到了硬递归限制)。因此,只需执行一次而不是为每个级别执行此操作可以节省大量时间(在我测试的案例中是系数3),因为regex替换和字符串替换比解析快得多。在

相关问题 更多 >

    热门问题