lxml:底层C语言实现、高效地处理html
介绍
lxml也是一个用于筛选指定html内容的模块,pyquery就是基于lxml。
使用lxml主要需要了解xpath
xpath语法
- /:在子节点里面找
- //:在子子孙孙节点里面找
- //div:查找当前网页的所有div标签
- //div/p:先找到所有的div标签,再从div的字标签中找p标签
- //div//p:先找到所有的div标签,再从div的子孙标签中找p标签
- //div/a:先查找所有div标签,再从div的子标签中找a标签
- //div/a[@id]:先查找所有div标签,再从div的子标签中找有id属性的a标签
- //div//a[@id='fuck']:先查找所有div标签,再从div的子孙标签中找有id='fuck'的a标签
- //div/a[1]:先查找所有的div标签,再找div的子标签中的第一个a标签,这里的索引是从1开始的,不是0
- //div/a[last()]:和上面一样,不过这里是最后一个a标签
- //div/a[position()<4]:前三个a标签
- //div/a[@price]:拥有price属性的a标签
- //div/a[@price=10]:拥有price属性,并且值等于10的a标签。当然里面还支持>,<,>=,<=等等
- //div/*:星号表示通配符,选取所有div的子标签
- //div/a[@*]:选取所有div的子标签中带有属性的a标签,什么属性都可以,id、class、href等等都可以
- //div/a | //div/p:选取所有的div的子标签中的所有a元素和p元素
- //div/a[contains(@class, "BDE")]:找出所有div的子标签中的class属性包含"BDE"的a标签
- //div/a[starts-with(@class, "BDE")]:找出所有div的子标签中的class属性以"BDE"开头的a标签
- //div/a[contains(@href, "mashiro")]:找出所有div的子标签中的class属性包含"mashiro"的a标签
- //a/@href:获取href属性
- //a/@class:获取class属性
- //a/text():获取文本
- //a[contains(text(), "清纯可爱")]:找出文本包含"清纯可爱"的a标签
我们可能注意到:@href、@class、text()前面只有一个/,如果是两个/的话,比如div标签,它里面是没有href属性的。但是div里面有a标签,a标签里面有href属性,所以我们仍然可以通过//div//@href去获取,此时获取的是里面的a标签里面的href,但是//div/@href是获取不到的,因为//div/@href表示的是获取div标签里面的href,而div没有href属性。
因此如果是/@href,那么前面必须是有href属性的标签,否则获取不到。但如果是//@href的话,前面的标签就没有太多要求了,可以是p标签,也可以是div标签,只要里面有具有href属性的标签即可
使用lxml
from lxml import etree
import requests
res = requests.get("http://www.baidu.com",
headers={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"})
res.encoding = res.apparent_encoding
# 调用etree内部的HTML方法,将html文本传进去,便得到一个可以进行xpath的对象
# 我们可以调用etree.tostring(html),会得到一个字节对象,再解码会得到字符串,这里就不演示了。
html = etree.HTML(res.text)
# 找出class属性等于"toindex"的a标签
result = html.xpath("//a[@class='toindex']")
for res in result:
# 打印的结果是一个标签
print(res) # <Element a at 0x1b2cb5cecc8>
# 可以调用tostring转成字节
print(etree.tostring(res)) # b'<a class="toindex" href="/">百度首页</a>'
print(str(etree.tostring(res), encoding="utf-8")) # <a class="toindex" href="/">百度首页</a>
# 内部还有一个etree.parse()方法,可以直接传入html文件或者xml文件的路径,进行解析
# 获取一下内部属性
result = html.xpath("//a[@class='toindex']/@href")
# 由于标签只有一个,所以列表里面只有一个元素
print(result) # ['/']
result = html.xpath("//a[@class='toindex']/@class")
print(result) # ['toindex']
result = html.xpath("//a[@class='toindex']/text()")
print(result) # ['百度首页']
# 可以看到此时的result又都不是标签了,这是为什么?
# 如果我们不选择href、class等具体属性的话,那么得到的是一个标签,如果选择属性那么得到是字符串
# 因为不止一个标签,所以会将所有的字符串组合成一个列表
# 即便只有一个元素,得到依旧是一个列表
result = html.xpath("//div[contains(@class, 'tab_inner')]")
# 现在获取的result里面只有一个元素
for res in result:
print(res) # <Element div at 0x2644f88>
print(etree.tostring(res)) # b'<div class="s_tab_inner">\n <b>网页</b>\n <a href=。。。。。。
# 我们看到了,如果不是获取href、class、text等属性的时候,得到的依旧是一个Element对象,这就意味着我们可以继续使用xpath
titles = res.xpath(".//a/text()") # 注意这里是.//不是//,因为我们要在当前元素的子孙中去查找
print(titles) # ['资讯', '贴吧', '知道', '音乐', '图片', '视频', '地图', '文库', '更多»']
# 我们试试不加.
titles = res.xpath("//a/text()")
# 可以看到内容就多了,因为即便是res.xpath,但指定//的话依旧会在全局html页面中查找
print(titles)
"""
# ['手写', '拼音', '关闭', '百度首页', '设置', '登录', '新闻', 'hao123',
'地图', '视频', '贴吧', '学术', '登录', '设置', '更多产品', '资讯', '贴吧',
'知道', '音乐', '图片', '视频', '地图', '文库', '更多»', '把百度设为主页',
'关于百度', 'About\xa0\xa0Baidu', '百度推广', '使用百度前必读', '意见反馈',
'京公网安备11000002000001号']
"""
# 进一步证实了两者结果是一样的
print(res.xpath("//a/text()") == html.xpath("//a/text()")) # True
lxml:底层C语言实现、高效地处理html的更多相关文章
- 深入php内核,从底层c语言剖析php实现原理
深入php内核,从底层c语言剖析php实现原理 非常好的电子书:http://www.cunmou.com/phpbook/preface.md 这是它的目录: PHP的生命周期 让我们从SAPI ...
- 安卓系统底层C语言算法之测试参数是几个long型的算法
#include <stdio.h> #define BITS_PER_LONG (sizeof(unsigned long) * 8) //求一个数x是几个long的长度 #define ...
- 安卓系统底层C语言算法之測试參数是几个long型的算法
#include <stdio.h> #define BITS_PER_LONG (sizeof(unsigned long) * 8) //求一个数x是几个long的长度 #define ...
- C语言高效编程的几招(绝对实用,绝对经典)
编写高效简洁的C语言代码,是许多软件工程师追求的目标.废话不说,走起! 第一招:以空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题 eg.字符串的 ...
- 为什么和其他语言相比C语言是快速的语言
初入门的我们经常听见别人说"真正的程序员用C语言编程,C是最快的语言因为它是最靠近及其底层的语言."那么和其他语言相比C语言到底有什么特别的呢? C语言没有什么特别,这就是它快速的 ...
- Python之lxml
作者:Shane 出处:http://bluescorpio.cnblogs.com lxml takes all the pain out of XML. Stephan Richter lxml是 ...
- C — 对C语言的认识
有趣的C语言代码 看一下这段代码输出的是什么 #include <stdio.h> int main() { ; printf("%d\n", printf(" ...
- 关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup
http://www.cnblogs.com/binye-typing/p/6656595.html 读者可能会奇怪我标题怎么理成这个鬼样子,主要是单单写 lxml 与 bs4 这两个 py 模块名可 ...
- 在Dubbo中使用高效的Java序列化(Kryo和FST)
在Dubbo中使用高效的Java序列化(Kryo和FST) 作者:沈理 文档版权:Creative Commons 3.0许可证 署名-禁止演绎 完善中…… TODO 生成可点击的目录 目录 序列化漫 ...
随机推荐
- WPF Slider Tickbar 中显示数值
class CustomTickBar : TickBar { protected override void OnRender(System.Windows.Media.DrawingContext ...
- 阶段3 3.SpringMVC·_05.文件上传_1 文件上传之上传原理分析和搭建环境
分成几个部分 里面可能就包含文件上传的值 提交方式要改成post 第三个就是提供一个input file的文件选择域 新建项目 新建一个项目 当前项目没有父工程 跳过联网下载 改成02 构建 编译和目 ...
- Linux scp 免密码 传输文件
Linux scp 免密码 传输文件 背景介绍 最近项目是集群化部署(由 node1,node2,node3 三台 CentOS 7.4 的虚拟机构成). 但是,涉及到跨机器同步文件的问题,想通过写s ...
- 【Linux】【一】linux 目录切换、创建目录和文件、编辑目录以及文件(txt)
以下 是在指定目录下创建文件夹目录,以及在该目录下创建txt文件进行编辑,保存. 然后删除相关文件以及目录的命令操作记录. 本操作记录中的命令简单解释: pwd 显示当前路径 ls 显示当前目录下的文 ...
- java:常见问题(解决获取properties乱码,解决poi自适应宽度)
1.解决获取properties乱码 File cf = new File("D:\\app\\java_jar\\config.properties"); String[] pa ...
- 神经网络中batch_size参数的含义及设置方法
本文作者Key,博客园主页:https://home.cnblogs.com/u/key1994/ 本内容为个人原创作品,转载请注明出处或联系:zhengzha16@163.com 在进行神经网络训练 ...
- java内存模型的实现
前几天,发了一篇文章,介绍了一下JVM内存结构.Java内存模型以及Java对象模型之间的区别.其中,Java内存模型,是这三个知识点当中最晦涩难懂的一个,而且涉及到很多背景知识和相关知识. 网上有很 ...
- 关于.Net Core+Angular+Ueditor富文本编辑器的使用方式
博客:https://www.cnblogs.com/24klr/ 资料:https://www.jianshu.com/p/0b21a1324d47 GitHub:https://github.co ...
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
- [爬虫] selenium介绍
认识selenium 在爬取百度文库的过程中,我们需要使用到一个工具selenium(浏览器自动测试框架),selenium是一个用于web应用程序测试的工具,它可以测试直接运行在浏览器中,就像我们平 ...