【问题标题】:BeautifulSoup replace tag by raw xml without parsing/escapingBeautifulSoup 用原始 xml 替换标签而不解析/转义
【发布时间】:2016-05-21 14:34:43
【问题描述】:

假设我有这样的xml(真实的更复杂):

<a>
    <b>
        <c replace="alpha" />
    </b>
    <d>
        <c replace="beta"></c>
    </d>
</a>

自从我can't use regex 以来,我已经用 BeautifulSoup (lxml) 解析了这个。现在我将&lt;c&gt; 替换为包含取决于属性的新有效xml 的字符串。这并不难。

但是我想这样做而不用 BeautifulSoup 解析新的 xml。原因是我只是要在之后美化它。有相当多的标签被大量的 xml 替换。它不是非常高效的解析然后美化所有内容。

有类似LiteralXmlPleaseDontParseThisTnx 节点的东西吗? (我找不到它,他们一定把它叫做别的东西,而且有太多不相关的命中,“原始 html”、“未解析的 html”、“文字 hmtl”......)。

或者,有没有办法美化上面的 xml,然后将新的 xml 作为纯文本插入其中(不对 xml 做任何假设)?

【问题讨论】:

  • 看看lxml。也许它可以帮助你。

标签: python xml xml-parsing beautifulsoup


【解决方案1】:

我找到了一种创建相同结果的方法,它恰好对我有用,但可能并不普遍适用。它属于问题的“替代”类别:在已解析的汤之外进行替换。

  • 在解析主文档之前转义字符串格式化大括号:

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

    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)
    

我承认我的情况有点特殊,所以可能对很多其他人没有帮助。但就我而言,每个&lt;c&gt; 都可以替换为包含更多&lt;c&gt;s 的xml。由于多进程通信,每个级别都需要解析或腌制。 (Pickling 只比解析快 20-50%,并且遇到了硬递归限制)。因此,只需执行一次而不是每个级别都可以为我节省大量时间(在我测试的情况下为因子 3),因为正则表达式替换和字符串替换比解析要快得多。

【讨论】:

    【解决方案2】:

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

    lxml 元素确实有一个replace 方法,但您必须向它传递一个元素,而不是一个字符串。目前尚不清楚您要尝试用什么替换 &lt;c&gt;,但如果您从一开始就将替换值创建为元素,则无需解析即可进行替换。

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

    【讨论】:

    • 我将 &lt;c&gt; 替换为包含有效 xml 的字符串(编辑问题以澄清)。感谢您直接使用lxml 的提示,我没有遇到BeautifulSoup 的问题,但我最好使用适当的库。太糟糕了,性能问题可能没有解决方案......
    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2017-09-24
    • 2013-03-20
    相关资源
    最近更新 更多