介绍

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的更多相关文章

  1. 深入php内核,从底层c语言剖析php实现原理

    深入php内核,从底层c语言剖析php实现原理 非常好的电子书:http://www.cunmou.com/phpbook/preface.md   这是它的目录: PHP的生命周期 让我们从SAPI ...

  2. 安卓系统底层C语言算法之测试参数是几个long型的算法

    #include <stdio.h> #define BITS_PER_LONG (sizeof(unsigned long) * 8) //求一个数x是几个long的长度 #define ...

  3. 安卓系统底层C语言算法之測试參数是几个long型的算法

    #include <stdio.h> #define BITS_PER_LONG (sizeof(unsigned long) * 8) //求一个数x是几个long的长度 #define ...

  4. C语言高效编程的几招(绝对实用,绝对经典)

    编写高效简洁的C语言代码,是许多软件工程师追求的目标.废话不说,走起! 第一招:以空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题 eg.字符串的 ...

  5. 为什么和其他语言相比C语言是快速的语言

    初入门的我们经常听见别人说"真正的程序员用C语言编程,C是最快的语言因为它是最靠近及其底层的语言."那么和其他语言相比C语言到底有什么特别的呢? C语言没有什么特别,这就是它快速的 ...

  6. Python之lxml

    作者:Shane 出处:http://bluescorpio.cnblogs.com lxml takes all the pain out of XML. Stephan Richter lxml是 ...

  7. C — 对C语言的认识

    有趣的C语言代码 看一下这段代码输出的是什么 #include <stdio.h> int main() { ; printf("%d\n", printf(" ...

  8. 关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup

    http://www.cnblogs.com/binye-typing/p/6656595.html 读者可能会奇怪我标题怎么理成这个鬼样子,主要是单单写 lxml 与 bs4 这两个 py 模块名可 ...

  9. 在Dubbo中使用高效的Java序列化(Kryo和FST)

    在Dubbo中使用高效的Java序列化(Kryo和FST) 作者:沈理 文档版权:Creative Commons 3.0许可证 署名-禁止演绎 完善中…… TODO 生成可点击的目录 目录 序列化漫 ...

随机推荐

  1. WPF Slider Tickbar 中显示数值

    class CustomTickBar : TickBar { protected override void OnRender(System.Windows.Media.DrawingContext ...

  2. 阶段3 3.SpringMVC·_05.文件上传_1 文件上传之上传原理分析和搭建环境

    分成几个部分 里面可能就包含文件上传的值 提交方式要改成post 第三个就是提供一个input file的文件选择域 新建项目 新建一个项目 当前项目没有父工程 跳过联网下载 改成02 构建 编译和目 ...

  3. Linux scp 免密码 传输文件

    Linux scp 免密码 传输文件 背景介绍 最近项目是集群化部署(由 node1,node2,node3 三台 CentOS 7.4 的虚拟机构成). 但是,涉及到跨机器同步文件的问题,想通过写s ...

  4. 【Linux】【一】linux 目录切换、创建目录和文件、编辑目录以及文件(txt)

    以下 是在指定目录下创建文件夹目录,以及在该目录下创建txt文件进行编辑,保存. 然后删除相关文件以及目录的命令操作记录. 本操作记录中的命令简单解释: pwd 显示当前路径 ls 显示当前目录下的文 ...

  5. java:常见问题(解决获取properties乱码,解决poi自适应宽度)

    1.解决获取properties乱码 File cf = new File("D:\\app\\java_jar\\config.properties"); String[] pa ...

  6. 神经网络中batch_size参数的含义及设置方法

    本文作者Key,博客园主页:https://home.cnblogs.com/u/key1994/ 本内容为个人原创作品,转载请注明出处或联系:zhengzha16@163.com 在进行神经网络训练 ...

  7. java内存模型的实现

    前几天,发了一篇文章,介绍了一下JVM内存结构.Java内存模型以及Java对象模型之间的区别.其中,Java内存模型,是这三个知识点当中最晦涩难懂的一个,而且涉及到很多背景知识和相关知识. 网上有很 ...

  8. 关于.Net Core+Angular+Ueditor富文本编辑器的使用方式

    博客:https://www.cnblogs.com/24klr/ 资料:https://www.jianshu.com/p/0b21a1324d47 GitHub:https://github.co ...

  9. 再谈js对象数据结构底层实现原理-object array map set

    如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...

  10. [爬虫] selenium介绍

    认识selenium 在爬取百度文库的过程中,我们需要使用到一个工具selenium(浏览器自动测试框架),selenium是一个用于web应用程序测试的工具,它可以测试直接运行在浏览器中,就像我们平 ...