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笔记
作者:上海-悠悠 python自动化交流 QQ群:779429633
python笔记27-lxml.etree解析html的更多相关文章
- IOS学习笔记27—使用GDataXML解析XML文档
http://blog.csdn.net/ryantang03/article/details/7868246
- 使用由 Python 编写的 lxml 实现高性能 XML 解析
lxml 简介 Python 从来不出现 XML 库短缺的情况.从 2.0 版本开始,它就附带了 xml.dom.minidom 和相关的 pulldom 以及 Simple API for XML ...
- python笔记28-lxml.etree爬取html内容
前言 本篇继续lxml.etree学习,在线访问接口,通过接口返回的html,解析出想要的text文本内容 环境准备: python 3.6 lxml requets 定位目标 爬取我的博客首页htt ...
- Python导入 from lxml import etree 导入不了
问题在学爬虫,Python 版本是2.7,安装的lxml包是4.3的,在 from lxml import etree 时发现一直报错,网上查询,原来是Python版本和lxml包版本不一致导致的. ...
- python笔记:windows 下安装 python lxml
原文:http://blog.csdn.net/zhaokuo719/article/details/8209496 windows 环境下安装 lxml python 1.首先保证你的python ...
- 吴裕雄--天生自然python学习笔记:Python3 XML 解析
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. XML 被设计用来传输和存 ...
- requests的content与text导致lxml的解析问题
title: requests的content与text导致lxml的解析问题 date: 2015-04-29 22:49:31 categories: 经验 tags: [Python,lxml, ...
- 爬虫笔记(四)------关于BeautifulSoup4解析器与编码
前言:本机环境配置:ubuntu 14.10,python 2.7,BeautifulSoup4 一.解析器概述 如同前几章笔记,当我们输入: soup=BeautifulSoup(response. ...
- python标准库xml.etree.ElementTree的bug
使用python生成或者解析xml的方法用的最多的可能就数python标准库xml.etree.ElementTree和lxml了,在某些环境下使用xml.etree.ElementTree更方便一些 ...
随机推荐
- Java 协变返回类型
协变返回类型表示在导出类的被覆盖方法可以返回基类方法的返回类型的某种导出类型 //: polymorphism/covarianreturn.java package object; class Gr ...
- SqlServer批量Sql一个表的数据导入到另一个数据
一个表的导入: SET IDENTITY_INSERT [master_new].[dbo].[OpinionList] ON INSERT INTO [master_new].[dbo].[Opin ...
- 解决Eclipse启动报错【Failed to create the Java Virtual Machine】
电脑:2G内存,WIN7 32位. 启动adt-bundle-windows-x86-20140702\eclipse\eclipse.exe时,报错[Failed to create the Jav ...
- maven 配置阿里云仓库
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> < ...
- 000 关于IDEA的基本环境配置以及快速使用(git拉载程序,Jdk安装,tomcat部署,应用程序打包运行)
刚开始工作的时候,不熟悉,所以整理过这个文档. 一:导入git程序 1.准备 git链接 IDEA软件,最好是终极版 2.第一步选择从版本控制上选择git 3.拷贝源于目标地址 4.这时候根据引导进行 ...
- 002.iSCSI服务端配置
一 iSCSI target的磁盘种类 大型文件 单一分区(partition) 磁盘 数组 RAID LVM 二 iSCSI创建步骤 建立用于共享的磁盘设备(分区/磁盘/文件) 创建后备磁盘 创建相 ...
- C++雾中风景10:聊聊左值,纯右值与将亡值
C++11的版本在类型系统上下了很大的功夫,添加了诸如auto,decltype,move等新的关键词来简化代码的编写与降低阅读代码的难度.为了更好的理解这些新的语义,笔者确定通过几篇文章来简单窥探一 ...
- MIT-6.828-JOS-lab4:Preemptive Multitasking
Lab 4: Preemptive Multitasking tags: mit-6.828, os 概述 本文是lab4的实验报告,主要围绕进程相关概念进行介绍.主要将四个知识点: 开启多处理器.现 ...
- 【python学习-4】可复用函数与模块
1.自定义函数 自定义函数格式如下: def <函数名> (参数列表): <函数语句> return <返回值> #!/usr/bin/python # 定义函数, ...
- 最新的裸机联想笔记本装win7系统/SSD(固态硬盘)上安装win7系统/联想K4450A i7装win7系统
老师让我帮他装个操作系统,由于是新电脑,并且老师的电脑上另安有固态硬盘,老师要我把系统安装在固态硬盘上,BIOS是2014年7月份的,所以BIOS设置项可能会有所变化. 下面是遇到的一些问题,及解决方 ...