如何通过python提取一块xml文件

时间:2015-01-20 14:12:48

标签: python regex xml file extraction

想象一下,我有一个巨大的xml文件:

.
.
.
<div class="span9">
      <div class="results-count">AAA</div>
<div class="AA">
  <div class="A"><a href="/TEST">BBB</a>
  </div>
  <div class="BB"><span>CCC</span><br/><a href="/TEST1" class="B">DDD</a>
    <div></div><span>EEE</span><br/><img src="TEST2" title="C"/><a href="/TEST3" class="D">FFF</a>,
<a href="/TEST4" class="E">GGG</a>
    <div class="clear"></div><a href="/TEST5" class="details">Details</a>
  </div>
  <pre>HHH</pre>
  <div class="clear"></div>
.
.
.

我想说python向我显示<div class="results-count">AAA</div><div class="clear"></div>之间的所有行。

注意:您在我的示例xml文件中看到的内容在我的巨大xml文件中是重复的。所以我想将所有这些段显示为我的python脚本的输出。

2 个答案:

答案 0 :(得分:0)

试试这个正则表达式:

<div class="results-count">[^<]+?</div>(.+?)<div class="clear"></div>
带有标志的

re.MULTILINE | re.IGNORECASE | re.DOTALL

DEMO - one block
DEMO - multiple blocks

请注意,正则表达式会在找到的第一个<div class="clear"></div>处停止。

以下是Python中的示例代码:

import re

p = re.compile(ur'<div class="results-count">[^<]+?</div>(.+)<div class="clear"></div>', re.MULTILINE | re.IGNORECASE | re.DOTALL)
test_str = u"<div class=\"span9\">\n      <div class=\"results-count\">AAA</div>\n<div class=\"AA\">\n  <div class=\"A\"><a href=\"/TEST\">BBB</a>\n  </div>\n  <div class=\"BB\"><span>CCC</span><br/><a href=\"/TEST1\" class=\"B\">DDD</a>\n    <div></div><span>EEE</span><br/><img src=\"TEST2\" title=\"C\"/><a href=\"/TEST3\" class=\"D\">FFF</a>,\n<a href=\"/TEST4\" class=\"E\">GGG</a>\n    <div class=\"clear\"></div><a href=\"/TEST5\" class=\"details\">Details</a>\n  </div>\n  <pre>HHH</pre>\n  <div class=\"clear\"></div>"

re.findall(p, test_str)

答案 1 :(得分:0)

你可以试试这个 https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.XML

也许HTML Parser。

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print "Start Tag (start_tag):", tag
    def handle_endtag(self, tag):
        print "End Tag(end_tag) :", tag
    def handle_data(self, data):
        print "Content :", data

parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')