【问题标题】:Include prefixes with lXML when using ElementTree使用 ElementTree 时在 lXML 中包含前缀
【发布时间】:2021-04-07 02:52:24
【问题描述】:

我目前正在解析在 Outlook 中创建的 HTML 格式的电子邮件。我一直在生成元素的路径,但有些标签有像

这样的前缀。下面的代码将

解析为

标记(删除前缀),但我试图包含整个

。有没有办法在 lXML 中强制这样做?

举个例子

<body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hi Joe<o:p></o:p>

解析为

/html/body/div/p[1]/p

但我想得到

/html/body/div/p[1]/o:p

parser = etree.HTMLParser()
etree.ElementTree.register_namespace('<o>')

try:
    root = etree.fromstring(messageHTML2, parser)
    print(root)
except Exception as e:
    print(e)

tree = etree.ElementTree(root)
for e in root.iter():
    pathItemList.append(tree.getpath(e))

【问题讨论】:

    标签: python html outlook tags lxml


    【解决方案1】:

    我解决这个问题的方法很糟糕,但是很有效。

    因为获取路径会删除前缀(分号之前的任何内容),我决定简单地将所有分号更改为一个特定的文本字符串,否则不太可能出现(在我的情况下,我只是使用 SEMICOLONHERE,但取决于你正在使用它可能需要更加模糊)。

    上面的例子看起来像:&lt;body lang=EN-US link="#0563C1" vlink="#954F72"&gt;&lt;div class=WordSection1&gt;&lt;p class=MsoNormal&gt;Hi Joe&lt;oSEMICOLONHEREp&gt;&lt;/oSEMICOLONHEREp&gt;,这是有效的。

    通过将分号更改为文本,在解析时它认为它只是一个标签。获得最终输出后,只需对该特定字符串进行替换以将其返回为分号即可产生所需的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2023-03-24
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多