例如,我有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');
但它不起作用。
答案 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>