问问题
1235 次
1 回答
2
您可能希望至少发布您实际尝试解析的数据的一部分。没有这些信息,这里是一个猜测。如果
<html>
元素定义了默认的 XML 命名空间,则在查找元素时需要使用它。例如,看看这个简单的文档:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd"
xml:lang="en">
<head>
<title>Document Title</title>
</head>
<body>
</body>
</html>
鉴于此输入,以下将不返回任何结果:
>>> doc = etree.parse(open('foo.html'))
>>> doc.xpath('//title')
[]
这失败了,因为我们正在寻找一个<title>
没有指定命名空间的元素......并且没有命名空间,解析器不会找到匹配项(因为foo:title
不同于
bar:title
,假设foo:
和bar:
是定义的 XML 命名空间)。
您可以使用 ElementTree 接口显式使用命名空间,如下所示:
>>> doc.xpath('//html:title',
... namespaces={'html': 'http://www.w3.org/1999/xhtml'})
[<Element {http://www.w3.org/1999/xhtml}title at 0x1087910>]
还有我们的比赛。
您也可以将命名空间前缀传递给tag
iterparse 的参数:
>>> titleIter = etree.iterparse(StringIO(str),
... tag='{http://www.w3.org/1999/xhtml}title')
>>> list(titleIter)
[(u'end', <Element {http://www.w3.org/1999/xhtml}title at 0x7fddb7c4b8c0>)]
如果这不能解决您的问题,请发布一些示例输入,我们将从那里开始工作。
于 2012-04-24T01:40:07.603 回答