python笔记27-lxml.etree解析html

前言

之前分享过一个python爬虫beautifulsoup框架可以解析html页面,最近看到lxml框架的语法更简洁,学过xpath定位的,可以立马上手。
使用环境:
python 3.6
lxml 4.2.4

lxml安装

使用pip安装lxml库

$ pip install lxml

pip show lxml查看版本号

$ pip show lxml

html解析

这里用到etree.HTML方法把html的文本内容解析成html对象
要打印html内容,可以用etree.tostring方法,encoding=”utf-8”参数可以正常输出html里面的中文内容。pretty_print=True是以标准格式输出

# coding:utf-8 from lxml import etree htmldemo = ''' <meta charset="UTF-8"> <!-- for HTML5 --> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <html><head><title>yoyo ketang</title></head> <body> <b><!--Hey, this in comment!--></b> <p class="title"><b>yoyoketang</b></p> <p class="yoyo">这里是我的微信公众号:yoyoketang <a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler教程</a>, <a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python笔记</a>, <a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文档</a>; 快来关注吧!</p> <p class="story">...</p> ''' # etree.HTML解析html内容 demo = etree.HTML(htmldemo) # 打印解析内容str t = etree.tostring(demo, encoding="utf-8", pretty_print=True) print(t.decode("utf-8"))

运行结果

<html>  <head><meta charset="UTF-8"/> <!-- for HTML5 --> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>yoyo ketang</title> </head>  <body> <b><!--Hey, this in comment!--></b> <p class="title"><b>yoyoketang</b></p> <p class="yoyo">这里是我的微信公众号:yoyoketang <a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler教程</a>, <a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python笔记</a>, <a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文档</a>; 快来关注吧!</p> <p class="story">...</p> </body> </html>

soupparser解析器

soupparser解析器比上面的etree.HTML容错性要好一点,因为其处理不规范的html的能力比etree强太多。

import lxml.html.soupparser as soupparser demo = soupparser.fromstring(htmldemo) t = etree.tostring(demo, encoding="utf-8", pretty_print=True) print(t.decode("utf-8"))

xpath使用案例

使用htnl解析器,最终是想获取html上的某些元素属性和text文本内容,接下来看下,用最少的代码,简单高效的找出想要的内容。
比如要获取“这里是我的微信公众号:yoyoketang”

# coding:utf-8 from lxml import etree htmldemo = ''' 复制上面的html内容 ''' # etree.HTML解析html内容 demo = etree.HTML(htmldemo) nodes = demo.xpath('//p[@class="yoyo"]') # 获取文本 t = nodes[0].text print(t)

运行结果:

这里是我的微信公众号:yoyoketang

从代码量上看,简单的三行代码就能找到想要的内容了,比之前的beautifulsoup框架要简单高效的多

nodes是xpath定位获取到的一个list对象,会找出所有符合条件的元素对象。可以用for 循环查看详情

# coding:utf-8 from lxml import etree htmldemo = ''' 复制上面的html内容 ''' # etree.HTML解析html内容 demo = etree.HTML(htmldemo) nodes = demo.xpath('//p[@class="yoyo"]') print(nodes)  # list对象 for i in nodes:    # 打印定位到的内容    print(etree.tostring(i, encoding="utf-8", pretty_print=True).decode("utf-8"))    # 元素属性,字典格式    print(i.attrib)

运行结果

[<Element p at 0x2bcd388>] <p class="yoyo">这里是我的微信公众号:yoyoketang <a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler教程</a>, <a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python笔记</a>, <a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文档</a>; 快来关注吧!</p> {'class': 'yoyo'}

二次查找

通过xpath定位语法//p[@class=”yoyo”]定位到的是class=”yoyo”这个元素以及它的所有子节点,如果想定位其中一个子节点,可以二次定位,继续xpath查找,如获取:python笔记

nodes = demo.xpath('//p[@class="yoyo"]') t1 = nodes[0].xpath('//a[@id="link2"]') print(t1[0].text)

运行结果

python笔记

(0)

相关推荐

  • python笔记28-lxml.etree爬取html内容

    前言 本篇继续lxml.etree学习,在线访问接口,通过接口返回的html,解析出想要的text文本内容 环境准备: python 3.6 lxml requets 定位目标 爬取我的博客首页htt ...

  • Python爬虫之用lxml库解析网页

    Python爬虫之用lxml库解析网页

  • 完整版Python笔记|超级有用

    完整版Python笔记|超级有用

  • LAC 课程笔记0415|UCLA院校解析

    第十三站.UCLA |导师| 建筑景观城市相关 Programs You can APPLY: a. Master of Architecture I ( 3-year professional pr ...

  • 胡希恕伤寒论学习笔记——27

    27.太阳病,发热恶寒,热多寒少,脉微弱者,此无阳也,不可发汗,宜桂枝二越婢一汤. 桂枝二越婢一汤方 桂枝 芍药 麻黄 甘草(炙)各十八铢 大枣四枚(掰)生姜一两二铢(切)石膏二十四铢(碎,绵裹) 上 ...

  • 【python笔记】python java 语法,对比学习

    【python笔记】python java 语法,对比学习

  • python笔记2-冒泡排序

    前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序. 一.基本原理 1.概念: 冒泡排序(Bubble Sort),是一种 ...

  • python笔记3-发送邮件(smtplib)

    前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人,专治各种不行,总之看完这篇麻麻再也不用担心我的邮件收不到了. 以下代码兼容python2和python3, ...

  • python笔记4-遍历文件夹目录os.walk()

    前言 如何遍历查找出某个文件夹内所有的子文件呢?并且找出某个后缀的所有文件 一.walk功能简介 1.os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. 2.walk( ...