1 回答
TA贡献1820条经验 获得超10个赞
假设g0.text.encode('utf8')返回您提供的示例 XML 字符串,那么您不需要使用 HTML 解析器。尝试这样的事情:
tests = etree.fromstring(g0.text.encode('utf8'))[0] # Notice the "[0]" here
for testCase in tests.findall("{TestSpec.xsd}TestCase"): # Notice the namespace here
print(testCase[0].text)
在上面的代码中,我曾经[0]获取根元素的第 0 个(第一个)子元素,也就是<Tests>标签。for 循环使用findallwhich 返回Tests与给定标签名称匹配的标签下的所有子项。请注意,我<TestSpec>在标记名称前的方括号中包含了顶级标记中的命名空间。在这种情况下,findall返回所有外部<TestCase>标签。在我[0]再次使用的循环中,它是<TestCase>标签的第一个孩子;在这种情况下,内部<TestCase>. 最后.text是包含“abc”的属性。
这将适用于这样的 XML:
<?xml version="1.0" encoding="utf-8"?>
<TestSpec xmlns="TestSpec.xsd">
<Tests>
<TestCase>
<TestCase>abc</TestCase>
</TestCase>
<TestCase>
<TestCase>def</TestCase>
</TestCase>
<TestCase>
<TestCase>ghi</TestCase>
</TestCase>
</Tests>
</TestSpec>
但不是这样:
<?xml version="1.0" encoding="utf-8"?>
<TestSpec xmlns="TestSpec.xsd">
<Tests>
<TestCase>
<TestCase>abc</TestCase>
<TestCase>def</TestCase>
<TestCase>ghi</TestCase>
</TestCase>
</Tests>
</TestSpec>
在这种情况下,您需要使用findall或 其他一些迭代方法,而不是[0]对第一个孩子进行硬编码。像这样的东西:
for outerTestCaseTag in tests.findall("{TestSpec.xsd}TestCase"):
for innerTestCase in outerTestCaseTag.findall("{TestSpec.xsd}TestCase"):
print(innerTestCase.text)
第一个[0]获得<Tests>标签的人也是如此。我确信有一些更好的“pythonic”循环理解来改进嵌套循环,但这是一般的想法。
添加回答
举报