【问题标题】:Parse html(or other xml) inside xml with Python 3使用 Python 3 在 xml 中解析 html(或其他 xml)
【发布时间】:2016-05-07 04:39:04
【问题描述】:

我正在尝试解析在 XML 中嵌入或包含 html 的大文件。我已经能够提取主 xml 的全部内容,但我无法访问嵌入的 html 的内容。

例如,我会有一个这样结构的文件:

<TitleContentExtra>Part 1</TitleContentExtra><SubTitle /><TitleOriginal /><Abstract /><FullText>
&lt;p&gt;&lt;strong class="grey" id="authordate"&gt; &lt;span class="gray pointer"&gt;Argh, &lt;em&gt;et al.&lt;/em&gt; 2001 [+] &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="bkg_gray" id="authordate2_container" style="display: none;"&gt;
&lt;p&gt;It is a big product [some_product]:[bib2bib]&lt;/p&gt;
&lt;ul class="ul_style_1"&gt;
    &lt;li&gt;More text goes here &lt;/li&gt;
    &lt;li&gt;Why do I have to do it? &lt;strong class="gray"&gt;Some text goes there&lt;/strong&gt; &lt;/li&gt;
</FullText><FullTextOriginal /><FullTextComment>
&lt;ol class="ol_style_3" id="notes_container"&gt;
    &lt;li&gt;&lt;span id="note_a"&gt;&lt;a name="notea"&gt;&lt;/a&gt;Extra information here.&lt;/span&gt;&lt;/li&gt;
</FullTextComment>

我在 Python 3 中的代码是这样的:

try:
    from lxml import etree as ET

except ImportError:
    import xml.etree.ElementTree as ET

tree = ET.ElementTree(file='Files\\xml_File.xml')
root = tree.getroot()

for child in root:
    print (child.tag, child.attrib)

print ('\n------------------\n')
for elem in tree.iter():
    #print (elem.tag, 'atrribute: ',  elem.attrib)
    for value in elem.getiterator(tag=elem.tag):
        #print (value.text)
        extags=str(value.text)
        try:
            xmldata=ET.fromstring(extags)
            print (xmldata.tags)
        except:
            print ('There is an error: :', extags)

我无法解析嵌入的 html/xml 文本。我已经尝试了很多关于soupparser、parse、...的选项,但没有一个可以工作,或者我无法让它们工作。

我需要解析整个 xml 文件,以便稍后获取所有标签和属性的列表,以便进一步处理它们。

【问题讨论】:

    标签: python html xml xml-parsing lxml


    【解决方案1】:

    嗯,您的嵌入 HTML 是 XML 转义的 - 很明显,您必须在尝试将其解析为 XML 之前取消转义。

    Python3 确实包含在html stdlib 模块中取消转义的快捷方式:

        import html
        ...
        extags=html.unescape(value.text)
        try:
            xmldata=ET.fromstring(extags)
            print (xmldata.tags)
        except:
            print ('There is an error: :', extags)
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多