zshuangyan / blog

我的个人博客
2 stars 0 forks source link

踩坑:lxml库解析HTML文件 #30

Open zshuangyan opened 5 years ago

zshuangyan commented 5 years ago

lxml中有两个子模块etree和html,可以直接调用etree的方法解析HTML字符串或文件,也可以调用html的方法来解析HTML的字符串或文件,目前测试四种解析方法,只有一种解析出了正确的结果。

test.html

<html>
<head>test</head>
<body>
<dl>
    <dt>
        <h1>h1</h1>
        <dl>
            <dt>
                <h3>h3</h3>
            </dt>
            <dt>
                <h3>h3</h3>
            </dt>
        </dl>
    </dt>
</dl>
</body>
</html>

测试脚本

from lxml import etree, html
import os

DIR_PATH = os.path.dirname(__file__)

with open(os.path.join(DIR_PATH, "test.html")) as f:
    text = f.read()
    doc = etree.HTML(text)
    result = doc.xpath('/html/body/dl/dt')[0]
    print("使用etree.HMTL接口")
    print("能够正确解析子元素个数: ", len(result) == 2)

    print("---------------------------------------------")

    doc1 = html.fromstring(text)
    result = doc1.xpath('/html/body/dl/dt')[0]
    print("使用html.fromstring接口")
    print("能够正确解析子元素个数: ", len(result) == 2)

print("---------------------------------------------")

html1 = etree.parse(os.path.join(DIR_PATH, "test.html"))
result = html1.xpath('/html/body/dl/dt')[0]
print("使用etree.parse接口")
print("能够正确解析子元素个数: ", len(result) == 2)

print("---------------------------------------------")

html2 = html.parse(os.path.join(DIR_PATH, "test.html"))
result = html2.xpath("/html/body/dl/dt")[0]
print("使用html.parse接口")
print("能够正确解析子元素个数: ", len(result) == 2)

测试结果:

使用etree.HMTL接口
能够正确解析子元素个数:  False
---------------------------------------------
使用html.fromstring接口
能够正确解析子元素个数:  False
---------------------------------------------
使用etree.parse接口
能够正确解析子元素个数:  True
---------------------------------------------
使用html.parse接口
能够正确解析子元素个数:  False