python--lxml
''' 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[1]:先查找所有的div标签,再找div的子标签中的第一个a标签,所以这里的索引是从1开始的,不是0 //div/a[last()]:和上面一样,不过这里是最后一个a标签 //div/a[position()<3]:前两个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标签 如果我想获取属性里面具体的值怎么办?比如我找到了a标签,我想要标签里面的href属性,该怎么做呢?其实也很简单。 //a/@href:获取href属性 //a/@class:获取class属性 //a/text():获取文本 因此我们的文本也可以用来定位 //a[contains(text(), "清纯可爱")]:找出文本包含"清纯可爱"的a标签 我们可能注意到:@href、@class、text()前面只有一个/,如果是两个/的话,比如div标签,它里面是没有href属性的。但是div里面有a标签,a标签里面有href属性 我们用//div/@href是获取不到的,因为div没有href属性 但我们用//div//@href是可以获取到的,获取的是a标签里面的href,但是//div/@href只是会获取当前div的href ''' 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 0x30cb888> # 可以调用tostring转成字节 print(etree.tostring(res)) # 内部还有一个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 = html.xpath("//div[contains(@class, 'tab_inner')]") 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
python--lxml的更多相关文章
- python笔记:windows 下安装 python lxml
原文:http://blog.csdn.net/zhaokuo719/article/details/8209496 windows 环境下安装 lxml python 1.首先保证你的python ...
- python lxml install
之前记得安装libxslt和libxml yum install libxml* -yyum install libxslt* -y wget http://lxml.de/files/lxml-3. ...
- Windows下安装Python lxml库(无废话版)
python官网:python-2.7.12.amd64.msihttps://pypi.python.org/pypi/setuptools:setuptools-28.6.0.zipsetupto ...
- python lxml教程
目前有很多xml,html文档的parser,如标准库的xml.etree , beautifulsoup , 还有lxml. 都用下来感觉lxml不错,速度也还行,就他了. 围绕三个问题: 问题 ...
- Python lxml 使用
lxml,是python中用来处理xml和html的功能最丰富和易用的库 from lxml import etree from lxml import html h = ''' <html&g ...
- python lxml库生成xml文件-节点命名空间问题
lxml库,处理xml很强大,官方文档:https://lxml.de/tutorial.html#namespaces 例如: 我们要生成如下格式的报文: <ttt:jesson xmlns: ...
- python处理xml的常用包(lib.xml、ElementTree、lxml)
python处理xml的三种常见机制 dom(随机访问机制) sax(Simple APIs for XML,事件驱动机制) etree python处理xml的三种包 标准库中的xml Fredri ...
- python网络爬虫之LXML与HTMLParser
Python lxml包用于解析html和XML文件,个人觉得比beautifulsoup要更灵活些 Lxml中的路径表达式如下: 在下面的表格中,我们已列出了一些路径表达式以及表达式的结果: 路径表 ...
- python爬微信公众号前10篇历史文章(3)-lxml&xpath初探
理解lxml以及xpath 什么是lxml? python中用来处理XML和HTML的library.与其他相比,它能提供很好的性能, 并且它支持XPath. 具体可以查看官方文档->http: ...
- Python爬虫基础之lxml
一.Python lxml的基本应用 <html> <head> <title> The Dormouse's story </title> </ ...
随机推荐
- POJ3070:Fibonacci——题解
http://poj.org/problem?id=3070 题目大意:求Fibonacci数列第n项,对10000取模. 矩阵乘法板子题……实在不知道写什么了. #include<iostre ...
- UVA.11384 Help is needed for Dexter (思维题)
UVA.11384 Help is needed for Dexter (思维题) 题意分析 同样水题一道,这回思路对了. 给出数字n,面对一个1,2,3,4--n的数字序列,你可以对他们的部分或者全 ...
- [zhuan]java发送http的get、post请求
http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html Http请求类 package wzh.Http; import jav ...
- STL之一:字符串用法详解
转载于:http://blog.csdn.net/longshengguoji/article/details/8539471 字符串是程序设计中最复杂的变成内容之一.STL string类提供了强大 ...
- springboot初学
首先苦于用ssh.ssm来搭建一个项目,这个基础搭建工作就大概要用半天的功夫才能弄好,想到就头疼,后面听了实验室一位大神的建议,用springboot啊,简单的不止一点点.就顺便学习了下这个神器,果然 ...
- syslog大小限制
位置 /etc/logrotate.d/rsyslog 相关配置信息察看man logrotate size k/M/G /var/log/syslog { rotate daily missingo ...
- [技巧篇]21.Android Studio的快捷键设置[图片版]
如果对你有帮助,请点击推荐!
- 任务调度 Quartz 学习(三) CronTrigger 表达式
CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表. CronT ...
- nginx 负载均衡实现
https://www.cnblogs.com/wang-meng/p/5861174.html
- bzoj 1776: [Usaco2010 Hol]cowpol 奶牛政坛——树的直径
农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可以抵达其他所 ...