Urllib与elementtree结合在一起

时间:2012-03-12 18:10:37

标签: python python-3.x urllib elementtree

我在使用标准Python库中的ElementTree模块解析简单HTML时遇到了一些问题。这是我的源代码:

from urllib.request import urlopen
from xml.etree.ElementTree import ElementTree

import sys

def main():
    site = urlopen("http://1gabba.in/genre/hardstyle")
    try:
        html = site.read().decode('utf-8')
        xml = ElementTree(html)
        print(xml)
        print(xml.findall("a"))        
    except:
        print(sys.exc_info())

if __name__ == '__main__':
    main()

要么失败,我在控制台上得到以下输出:

<xml.etree.ElementTree.ElementTree object at 0x00000000027D14E0>
(<class 'AttributeError'>, AttributeError("'str' object has no attribute 'findall'",), <traceback object at 0x0000000002910B88>)

所以xml确实是一个ElementTree对象,当我们查看documentation时,我们会看到ElementTree类有一个findall函数。额外的东西:xml.find(“a”)工作正常,但它返回一个int而不是一个Element实例。

那么有人可以帮帮我吗?我误解了什么?

2 个答案:

答案 0 :(得分:2)

ElementTree(html)替换为ElementTree.fromstring(html),并将导入语句更改为from xml.etree import ElementTree

这里的问题是ElementTree构造函数不期望字符串作为其输入 - 它需要一个Element对象。函数xml.etree.ElementTree.fromstring()是从字符串构建ElementTree的最简单方法。

我猜测XML解析器不是你真正想要的任务,因为你正在解析HTML(不一定是有效的XML)。您可能需要查看:

答案 1 :(得分:0)

该行应为:

xml = ElementTree(file=html)

P.S。:以上只有在XML结构良好时才有效。如果XML结构中存在错误或HTML错误,则会引发ParseError。

您可能希望使用BeautifulSoup进行HTML解析。如果你想使用XPATH和lxml,你可能也喜欢html5lib。

这很简单:

tree = html5lib.parse(html.content, treebuilder='lxml', namespaceHTMLElements=False)
# the tree is a lxml object (parsed from any/bad html) supporting findall and find with xpaths