我在使用标准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实例。
那么有人可以帮帮我吗?我误解了什么?
答案 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