使用 lxml 解析 xml 文档
一、从字符串中解析
1、fromstring
from lxml import etree
if __name__ == '__main__':
text = "<div><h1>1</h1><h2>2</h2><h3>3</h3><h4>4</h4><h5>5</h5><h6>6</h6></div>"
# 从字符串中解析 XML 文档
tree = etree.fromstring(text=text)
print(type(tree))
print(etree.tostring(tree))
fromstring:从字符串中解析 xml 文档或者xml 文档片段。返回解析到的根节点。
text 要解析的字符串
parser:用于指定替换默认解析的解析器。如果想替换默认的 XMLParser,可以指定 parser 参数。
2、XML
from lxml import etree
if __name__ == '__main__':
text = "<div><h1>1</h1><h2>2</h2><h3>3</h3><h4>4</h4><h5>5</h5><h6>6</h6></div>"
tree = etree.XML(text=text)
print(type(tree))
print(etree.tostring(tree))
XML :从字符串常量中解析 XML 文档或者 XML 文档片段。如果想替换默认的 XMLParser,可以指定 parser 参数。
3、 HTML
from lxml import etree
if __name__ == '__main__':
text = "<div><h1>1</h1><h2>2</h2><h3>3</h3><h4>4</h4><h5>5</h5><h6>6</h6></div>"
tree = etree.HTML(text=text)
print(type(tree))
print(etree.tostring(tree))
HTML:从字符串常量中解析 HTML 文档或者 HTML 文档片段。如果想替换默认的 HTMLParser, 可以指定parser 参数。
二、从文件中进行解析
<?xml version="1.0" encoding="utf-8" ?>
<namelist>
<classcom>
<student>
<name>abc</name>
<age>18</age>
<gender>M</gender>
</student>
</classcom>
</namelist>
解析 xml 文件
from lxml import etree
if __name__ == '__main__':
tree = etree.parse(source="example.xml")
print(type(tree))
print(etree.tostring(tree))
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<div>
<h1>1</h1>
<h2>2</h2>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
</div>
</body>
</html>
from lxml import etree
if __name__ == '__main__':
tree = etree.parse(source="example.html")
print(type(tree))
print(etree.tostring(tree))
运行时报错:Traceback (most recent call last):
File "D:/spider/tutorial/lxml_parse.py", line 24, in <module>
tree = etree.parse(source="example.html")
File "src\lxml\etree.pyx", line 3536, in lxml.etree.parse
File "src\lxml\parser.pxi", line 1876, in lxml.etree._parseDocument
File "src\lxml\parser.pxi", line 1902, in lxml.etree._parseDocumentFromURL
File "src\lxml\parser.pxi", line 1805, in lxml.etree._parseDocFromFile
File "src\lxml\parser.pxi", line 1177, in lxml.etree._BaseParser._parseDocFromFile
File "src\lxml\parser.pxi", line 615, in lxml.etree._ParserContext._handleParseResultDoc
File "src\lxml\parser.pxi", line 725, in lxml.etree._handleParseResult
File "src\lxml\parser.pxi", line 654, in lxml.etree._raiseParseError
File "example.html", line 6
lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: meta line 4 and head, line 6, column 8
解决方法1:
修改 html 文件,在 <meta charset="UTF-8"> 为<meta charset="UTF-8" />
不推荐使用,因为在解析爬虫下载后的文件,不可能手工修改。
解决方法2:
from lxml import etree
if __name__ == '__main__':
tree = etree.parse(source="example.html", parser=etree.HTMLParser())
print(type(tree))
print(etree.tostring(tree))
原因:默认情况下,使用的解析器时 XMLParser。根据HTML代码的规范性,标签都要求是一对出现的,这种单标签需要补一个斜线,但是我们常用的IDE(pycharm、idea、webstorm、VS code 等)生成这一行代码的时候往往都不会自动补全一个斜线。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)