'''
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. CentOS 用户管理useradd、usermod等

    1.创建新用户useradd,默认的用户家目录会被存放在/home 目录中,默认的 Shell 解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组. 主要参数: -d 指定用户的家 ...

  2. 【题解】Atcoder AGC#16 E-Poor Turkeys

    %拜!颜神怒A此题,像我这样的渣渣只能看看题解度日╭(╯^╰)╮在这里把两种做法都记录一下吧~ 题解做法:可以考虑单独的一只鸡 u 能否存活.首先我们将 u 加入到集合S.然后我们按照时间倒序往回推, ...

  3. BZOJ1934:[SHOI2007]善意的投票 & BZOJ2768:[JLOI2010]冠军调查——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1934 https://www.lydsy.com/JudgeOnline/problem.php? ...

  4. 【bzoj2743】[HEOI2012]采花 树状数组

    题目描述 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公 ...

  5. 【极值问题】【CF1063B】 Labyrinth

    传送门 Description 给你一个\(n~\times~m\)的矩阵,一开始你在第\(r\)行第\(c\)列.你的上下移动不受限制,向左最多移动\(x\)次,向右最多移动\(y\)次.求你最多能 ...

  6. ubuntu14安装tensorflow并测试

    1.ubuntu版本的选择:看了很多博文,建议使用ubuntu14,稳定兼容性好. 2.tensorflow的安装: http://wiki.jikexueyuan.com/project/tenso ...

  7. c# MD5盐值加密

    using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...

  8. 【BZOJ】4530: [Bjoi2014]大融合

    [题意]给定n个点的树,从无到有加边,过程中动态询问当前图某条边两端连通点数的乘积,n<=10^5. [算法]线段树合并+并查集 (||LCT(LCT维护子树信息 LCT维护子树信息(+启发式合 ...

  9. python初步学习-查看文档及数据类型转换

    学会查看文档 python最权威的文档就是官方文档,因此,我们要学会查看官方文档.而在python解释器中,help() 命令就可以很权威的查看官方文档. 因此,我们要学会使用 help() 命令. ...

  10. 爬虫--Urllib库详解

    1.什么是Urllib? 2.相比Python2的变化 3.用法讲解 (1)urlopen urlllb.request.urlopen(url,data=None[timeout,],cahle=N ...