如何用lxml解析xml

时间:2014-10-29 14:49:33

标签: python xml

例如,我有XML doc:

<?xml version="1.0"?>
<a>
  <b>Text I need</b>
</a>
<a>
  <b>Text I need2</b>
</a>

如何解析b内的所有文本。我把整个文件读成一个字符串。 我只知道如何解析html,尝试将其应用于html,但失败了。

from lxml import html   
string = myfile.read();
tree = html.fromstring(string);
result = tree.xpath('//a/@b');

但它不起作用。

1 个答案:

答案 0 :(得分:1)

您应该做的第一件事是确保您的xml文件已正确格式化为lxml。如果整个文档未包含在整个“body”标记中,则lxml解析器将失败。我可以提出这个建议:

<?xml version="1.0"?>
<body>
  <a>
    <b>Text I need</b>
  </a>
  <a>
    <b>Text I need2</b>
  </a>
</body>

让我们将此文件称为“foo.xml”。现在这种数据格式更适合解析,从lxml库导入etree:

from lxml import etree as et

现在是时候解析数据并创建一个从中开始的根对象:

file_name = r"C:\foo.xml"
xmlParse = et.parse(file_name)  #Parse the xml file
root = xmlParse.getroot()  #Get the root

一旦声明了根对象,我们现在可以使用getiterator()方法迭代所有b标记。因为getiterator()方法听起来很像迭代器,所以我们可以使用list comprehension将元素对象保存在列表中。从那里我们可以编辑b标签之间的文本:

bTags = [tag for tag in root.getiterator("b")]  #List comprehension with the iterator
bTags[0].text = "Change b tag 1."  #Change tag from "Text I need"
bTags[1].text = "Change b tag 2."  #Change tag from "Text I need2"
xmlParse.write(file_name)  #Edit original xml file

最终输出应该如下所示:

<?xml version="1.0"?>
<body>
  <a>
    <b>Change b tag 1.</b>
  </a>
  <a>
    <b>Change b tag 2.</b>
  </a>
</body>