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

  1. python笔记:windows 下安装 python lxml

    原文:http://blog.csdn.net/zhaokuo719/article/details/8209496 windows 环境下安装 lxml python 1.首先保证你的python ...

  2. python lxml install

    之前记得安装libxslt和libxml yum install libxml* -yyum install libxslt* -y wget http://lxml.de/files/lxml-3. ...

  3. Windows下安装Python lxml库(无废话版)

    python官网:python-2.7.12.amd64.msihttps://pypi.python.org/pypi/setuptools:setuptools-28.6.0.zipsetupto ...

  4. python lxml教程

    目前有很多xml,html文档的parser,如标准库的xml.etree , beautifulsoup  ,  还有lxml. 都用下来感觉lxml不错,速度也还行,就他了. 围绕三个问题: 问题 ...

  5. Python lxml 使用

    lxml,是python中用来处理xml和html的功能最丰富和易用的库 from lxml import etree from lxml import html h = ''' <html&g ...

  6. python lxml库生成xml文件-节点命名空间问题

    lxml库,处理xml很强大,官方文档:https://lxml.de/tutorial.html#namespaces 例如: 我们要生成如下格式的报文: <ttt:jesson xmlns: ...

  7. python处理xml的常用包(lib.xml、ElementTree、lxml)

    python处理xml的三种常见机制 dom(随机访问机制) sax(Simple APIs for XML,事件驱动机制) etree python处理xml的三种包 标准库中的xml Fredri ...

  8. python网络爬虫之LXML与HTMLParser

    Python lxml包用于解析html和XML文件,个人觉得比beautifulsoup要更灵活些 Lxml中的路径表达式如下: 在下面的表格中,我们已列出了一些路径表达式以及表达式的结果: 路径表 ...

  9. python爬微信公众号前10篇历史文章(3)-lxml&xpath初探

    理解lxml以及xpath 什么是lxml? python中用来处理XML和HTML的library.与其他相比,它能提供很好的性能, 并且它支持XPath. 具体可以查看官方文档->http: ...

  10. Python爬虫基础之lxml

    一.Python lxml的基本应用 <html> <head> <title> The Dormouse's story </title> </ ...

随机推荐

  1. bzoj 1934: [Shoi2007]Vote 善意的投票 (最小割)

    原来是赞同的连源,原来是反对的连汇,然后是朋友的就连在一起,这样最小割就是割掉违背和谐的吧 type arr=record toward,next,cap:longint; end; const ma ...

  2. 【BZOJ4066】简单题(KD-Tree)

    [BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...

  3. POJ3281:Dining——题解

    http://poj.org/problem?id=3281 题目大意: N牛,F种吃的D种喝的,牛可以在它喜欢的吃的喝的选一组,之后就不能选这个吃的喝的. 问最多满足多少人. ——————————— ...

  4. BZOJ1036:[ZJOI2008]树的统计——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1036 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来 ...

  5. AOJ.176 两数组最短距离 (乱搞题)

    两数组最短距离 点我挑战题目 题意分析 给出2个数组,让求出2个数组元素差的绝对值的最小值是多少. 我这里是o(m+n)的算法.首先对于第一个数组,让他的第一个元素和第二个元素比较,如果他的第一个元素 ...

  6. 除了love和hate,还能怎么表达那些年的“爱恨情仇”?

    实用英语 帮你全面提高英语水平 关注 童鞋们每次刷美剧的时候,相信都会被CP感满满的男女主角虐得体无完肤吧. 可是,一到我们自己表达爱意或者恨意的时候,却苦于词穷,只会用love, like, hat ...

  7. The Usage of Pymongo

    Install pymongo document install pymongo from the tar package download from website python setup.y i ...

  8. Aidl实现进程间通信,跨进程回调

    aidl支持的文件类型 1. Java 编程语言中的基本类型, 如 int.long.boolean 等, 不需要 import. 2. String.List.Map 和 CharSequence, ...

  9. XSS攻击处理方案

    1. XSS攻击基本概念 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏洞 ...

  10. easyui datagrid 的数据加载Json数据

    var obj = {'total':100,'rows':[{id:'1',name:'一'},{id:'2',name:'二'}]}; $('#tt').datagrid('loadData',o ...