简介
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号古宅’], ‘产地’: [‘中国大陆’], ‘导演’: [‘袁杰’], ‘主演’: [‘葛天 / 扈天翼 / 黄心娣’]}, {‘标题’: [‘合法伴侣’], ‘产地’: [‘中国大陆’], ‘导演’: [‘黄雷’], ‘主演’: [‘李治廷 / 张榕容 / 白客’]}, {‘标题’: [‘通往春天的列车’], ‘产地’: [‘中国大陆’], ‘导演’: [‘李骥’], ‘主演’: [‘任素汐 / 李岷城 / 陈宇星’]}, {‘标题’: [‘撼山瑶’], ‘产地’: [‘中国大陆’], ‘导演’: [‘马雍’], ‘主演’: [‘曾格格 / 姜永波 / 辛祚宇’]}]