使用Python 3

时间:2016-01-29 12:29:34

标签: python html xml xml-parsing lxml

我正在尝试解析嵌入了HTML或包含在XML中的大文件。我已经能够提取主要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文本。我已经尝试了很多选择,包括解析器,解析,......但没有一个可行,或者我无法使它们工作。

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

1 个答案:

答案 0 :(得分:0)

那么,你的嵌入式HTML是XML-ecaped - 显然你必须在尝试将其解析为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)
    ...