一、从字符串中解析

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 等)生成这一行代码的时候往往都不会自动补全一个斜线。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐