LXML(Xpath)解析库的使用

简介

xpath是一种html和xml的查询语言,它能够在html和xml的树状结构中寻找节点

基础知识

https://mp.weixin.qq.com/s?__biz=MzAxMTkwODIyNA==&mid=2247492577&idx=2&sn=c4932b7c44dc28d2583f045429fb03c6&source=41#wechat_redirect

https://mp.weixin.qq.com/s?__biz=MzU1MjYzNjQwOQ==&mid=2247486212&idx=2&sn=507e0c90b5962c65a33ac9303a9b3879&chksm=fbfe5192cc89d8849c36f0de139ce9a5df90aca662e404c2eca936c0613b2053250e55de0ca8&mpshare=1&scene=1&srcid=1022jwOmoGiYqNKA0pRzWZ9E&sharer_sharetime=1571706295810&sharer_shareid=b634227b991f1e068e9e1a3902256596

https://mp.weixin.qq.com/s?__biz=MzU3MzQxMjE2NA==&mid=2247484474&idx=1&sn=a58e404c6cd1aff253252c1922bbf37b&chksm=fcc34211cbb4cb07f75ed621c69e279f394f78abe28f5f766870f24205c24da76b26107917e6&mpshare=1&scene=1&srcid=

导入库

from lxml import etree
import requests
etree具体功能:
  • 将html字符转换成element对象
  • element对象可以转换成为字符串或者二进制的类型
基本使用方法
我们可以利用他来解析HTML代码,并且在解析HTML代码的时候,如果HTML代码不规范,他会自动的进行补全
text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a> 
         # 注意,此处缺少一个 </li> 闭合标签
     </ul>
 </div>
'''

#利用etree.HTML,将字符串解析为HTML文档
html = etree.HTML(text) 

# 按字符串序列化HTML文档
result = etree.tostring(html, encoding='utf-8').decode('utf-8') 

print(result)  # 失灵了?
<html><body><div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a> 
         # 注意,此处缺少一个 </li> 闭合标签
     </ul>
 </div>
</body></html>

读取文件

除了直接使用字符串进行解析,lxml还支持从文件中读取内容
# 读取本地文件 hello.html
# 如果出现解析错误,可以手动指定解析方式
# parser = etree.HTMLParser('utf-8')
# html = etree.parse('hello.html', parser=parser)
result = etree.tostring(html, pretty_print=True)

使用Xpath语法

# 这里以豆瓣为例
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
response = requests.get('https://movie.douban.com/top250', headers=headers).text
html = etree.HTML(response)
print(html)
html = html.xpath('//div[@class="info"]')
<Element html at 0x23b70bc0348>
获取所有li元素下的所有class属性的值
result = html.xpath('//li/@class')
获取li标签下href为www.baidu.com的a标签
result = html.xpath('//li/a[@href="www.baidu.com"]')
获取li标签下所有span标签
#result = html.xpath('//li/span')
#注意这么写是不对的:
#因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠

result = html.xpath('//li//span')
获取li标签下的a标签里的所有class
result = html.xpath('//li/a//@class')
获取最后一个li的a的href属性对应的值
result = html.xpath('//li[last()]/a/@href')
# 谓语 [last()] 可以找到最后一个元素
获取倒数第二个li元素的内容
result = html.xpath('//li[last()-1]/a')

# text 方法可以获取元素内容
print(result[0].text)
获取倒数第二个li元素的内容的第二种方式
result = html.xpath('//li[last()-1]/a/text()')
### 简单爬取
import requests
from lxml import etree

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}

url = 'https://movie.douban.com/cinema/nowplaying/pingdingshan/'

response = requests.get(url, headers=headers)
text = response.text

html = etree.HTML(text)
ul = html.xpath('//div[@class="mod-bd"]/ul[@class="lists"]')[0]
# print(etree.tostring(ul, encoding='utf-8').decode('utf-8'))
lis = ul.xpath('./li')
movielist = []
for li in lis:
    moviedict = {}
    title = li.xpath('@data-title')
    region = li.xpath('@data-region')
    director = li.xpath('@data-director')
    actors = li.xpath('@data-actors')

    moviedict = {
        '标题': title,
        '产地': region,
        '导演': director,
        '主演': actors,
    }

    movielist.append(moviedict)
print(movielist)

[{‘标题’: [‘大赢家’], ‘产地’: [‘中国大陆’], ‘导演’: [‘于淼’], ‘主演’: [‘大鹏 / 柳岩 / 代乐乐’]}, {‘标题’: [‘应承’], ‘产地’: [‘中国大陆’], ‘导演’: [‘王军’], ‘主演’: [‘冯远征 / 雷恪生 / 于非非’]}, {‘标题’: [‘刺猬索尼克’], ‘产地’: [‘加拿大 日本 美国’], ‘导演’: [‘杰夫·福勒’], ‘主演’: [‘金·凯瑞 / 詹姆斯·麦斯登 / 提卡·森普特’]}, {‘标题’: [‘呼吸’], ‘产地’: [‘法国 加拿大’], ‘导演’: [‘丹尼尔·罗比’], ‘主演’: [‘罗曼·杜里斯 / 欧嘉·柯瑞兰寇 / 芳汀·阿杜安’]}, {‘标题’: [‘月半爱丽丝’], ‘产地’: [‘中国大陆’], ‘导演’: [‘张林子’], ‘主演’: [‘关晓彤 / 黄景瑜 / 官鸿’]}, {‘标题’: [‘五彩缤纷’], ‘产地’: [‘中国大陆 美国’], ‘导演’: [‘胡安’], ‘主演’: [‘朱珠 / 艾米·欧文 / 李雅男’]}, {‘标题’: [‘82号古宅’], ‘产地’: [‘中国大陆’], ‘导演’: [‘袁杰’], ‘主演’: [‘葛天 / 扈天翼 / 黄心娣’]}, {‘标题’: [‘合法伴侣’], ‘产地’: [‘中国大陆’], ‘导演’: [‘黄雷’], ‘主演’: [‘李治廷 / 张榕容 / 白客’]}, {‘标题’: [‘通往春天的列车’], ‘产地’: [‘中国大陆’], ‘导演’: [‘李骥’], ‘主演’: [‘任素汐 / 李岷城 / 陈宇星’]}, {‘标题’: [‘撼山瑶’], ‘产地’: [‘中国大陆’], ‘导演’: [‘马雍’], ‘主演’: [‘曾格格 / 姜永波 / 辛祚宇’]}]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值