Python解析本地html文件 数据存储为字典

页面分析:

每个字段都很规整页面所有数据都存放在div标签下,且class属性值为cellm;每个div标签下都存放一对数据。

解析思路:

  1. 将本地html文件读取并转化成HTML对象可以使用xpath语法进行解析
  2. xpath语法解析出每一个div标签,报存在divs中
  3. 遍历每一个div在div标签中再次使用xpath语法解析出键值对,并保存在字典中
from lxml import etree
# 解析本地html,返回字典数据类型
def parse_html(file_path):
    with open(file_path, 'r') as f:
        html = etree.HTML(f.read())
    divs = html.xpath("//div[contains(@class, 'cellm')]")
    res = {}
    for div in divs:
        key = div.xpath("./span[1]/text()")[0].replace('/', '_')
        value = div.xpath("./span[2]/text()")[0]
        res[key] = value
    return res

 问题1:如何将本地的html文件转化成HTML对象,进而可以使用xpath语法解析

这里需要使用lxml库中的etree。

上面这种方式测试是可以的,打开文件读取f.read(), 成一个字符文本,进而使用etree.HTML()转化为HTML对象。可以使用下面的方法打印查看HTML对象的内容

print(etree.tostring(html, encoding='utf-8').decode('utf-8'))

etree转化html成文本型,存在先编码成二进制,再解码成文本这一过程,打印结果不会造成乱码

问题2:如何实现div对象下使用xpath继续解析

这里遇到一个问题,开始也是想不明白:已经解析到每一个div标签了再使用xpath解析时该div标签不应该时跟节点了吗?那么下面这种方式为什么仍然选出很多内容呢? 

# 注意xpath里二个斜线
key = div.xpath("//span[1]/text()")

这种方式选出的span值时所有的,xpath仍然是从根节点开始查找,所以这里需要修改为相对位置

# 注意xpath是./ 表示相对位置
key = div.xpath("./span[1]/text()")

还有注意的一点是,xpath解析出的结果是放在列表中返回,因此需要使用索引进行取值赋值给key和value。

问题3:解析时使用模糊匹配的方式

html.xpath("//div[contains(@class, 'cellm')]")

这是考虑到有些div标签class值时不一样的,但是都包含cellm这个值。

问题4:取标签中的值和标签属性的值

姓名,年龄等一些字段并不是标签的一个属性,需要取值如何实现?

/text()       方法可以去值 

/@herf     获取某一属性的值

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值