1.XPath概述
XML Path Language
2.XPath解析操作
bash
# -*- coding: utf-8 -*-
"""
@Project : 01-python-learn
@File : demo16.py
@IDE : PyCharm
@Author : 刘庆东
@Date : 2025/11/19 14:16
"""
from lxml import etree
# html_str = '''
# <div class="level_one on">
# <ul>
# <li>
# <a href="/index/index/view/id/1.html" title="什么是Java" class="on">什么是Java</a>
# <a>Java</a>
# </li>
# <li> <a href="javascript:" onclick="login(0)" title="Java的版本">Java的版本</a> </li>
# <li> <a href="javascript:" onclick="login(0)" title="Java API文档">Java API文档</a> </li>
# </ul>
# </div>
# '''
#
# html=etree.HTML(html_str)#解析html字符串
#
# #获取li节点中的所有的直接点a
# a_all=html.xpath('//li/a')
# print(a_all)
#
#
# a_txt=etree.tostring(a_all[1],encoding='utf-8')
# print("获取的html代码是:",a_txt.decode('utf-8'))
html_str = '''
<div class="level_one on">
<ul>
<li>
<a href="/index/index/view/id/1.html" title="什么是Java" class="on">什么是Java</a>
<a>Java</a>
</li>
<li> <a href="javascript:" onclick="login(0)" title="Java的版本">Java的版本</a> </li>
<li> <a href="javascript:" onclick="login(0)" title="Java API文档">Java API文档</a> </li>
</ul>
</div>
'''
html=etree.HTML(html_str)#解析html字符串
#
# #获取ul节点中的所有子孙节点a
# a_all=html.xpath('//ul//a')
# print(a_all[3])
#
# a_txt=etree.tostring(a_all[3],encoding='utf-8')
# print("获取的html代码是:",a_txt.decode('utf-8'))
#获取a节点的父节点
a_parent=html.xpath('//a/..')
print(a_parent)
print(a_parent[0])
a_txt=etree.tostring(a_parent[0],encoding='utf-8')
print("获取的html代码是:",a_txt.decode('utf-8'))
3.爬取某网站的电影Top250
bash
# -*- coding: utf-8 -*-
"""
@Project : 01-python-learn
@File : demo18.py
@IDE : PyCharm
@Author : 刘庆东
@Date : 2025/11/19 14:54
豆瓣电影数据爬取
https://movie.douban.com/top250
"""
# 导入模块 etree 导入时间 导入随机 导入网络请求
from lxml import etree
import time
import random
import requests
#伪装一下头信息
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 12.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
#处理大量的空白的字符
def liubai(strs):
#定义保存内容的字符
s=''
for n in strs:
n=''.join(n.split())#去除空的字符
s=s+n#拼接字符串
return s
#获取电影的信息
def get_movie_info(url):
#发送网络请求
response = requests.get(url, headers=header)
#解析html元素
html=etree.HTML(response.text)
#获取所有的层 div+css布局页面
div_all=html.xpath('//div[@class="info"]')
for div in div_all:
# 获取电影名字信息
names=div.xpath('./div[@class="hd"]/a//span/text()')
name=liubai(names)
# 获取导演主演信息
infos=div.xpath('./div[@class="bd"]/p/text()')
info=liubai(infos)
# 获取电影评分
scores=div.xpath('./div[@class="bd"]/div/span[2]/text()')
score=liubai(scores)
#作业 获取每一部电影有多少人评价
# 作业 电影文字总结
print("电影名字是:",name)
print("导演主演:",info)
print("电影评分:",score)
print("----------------分割线-----------------")
if __name__ == '__main__':
for i in range(0,250,25):
url="https://movie.douban.com/top250?start={page}&filter=".format(page=i)
get_movie_info(url)
time.sleep(random.randint(1,3))
"""
部分输出结果如下:
电影名字是: 肖申克的救赎/TheShawshankRedemption/月黑高飞(港)/刺激1995(台)
导演主演: 导演:弗兰克·德拉邦特FrankDarabont主演:蒂姆·罗宾斯TimRobbins/...1994/美国/犯罪剧情
电影评分: 9.7
----------------分割线-----------------
电影名字是: 霸王别姬/再见,我的妾/FarewellMyConcubine
导演主演: 导演:陈凯歌KaigeChen主演:张国荣LeslieCheung/张丰毅FengyiZha...1993/中国大陆中国香港/剧情爱情同性
电影评分: 9.6
----------------分割线-----------------
电影名字是: 泰坦尼克号/Titanic/铁达尼号(港/台)
导演主演: 导演:詹姆斯·卡梅隆JamesCameron主演:莱昂纳多·迪卡普里奥Leonardo...1997/美国墨西哥/剧情爱情灾难
电影评分: 9.5
----------------分割线-----------------
电影名字是: 阿甘正传/ForrestGump/福雷斯特·冈普
导演主演: 导演:罗伯特·泽米吉斯RobertZemeckis主演:汤姆·汉克斯TomHanks/...1994/美国/剧情爱情
电影评分: 9.5
----------------分割线-----------------
电影名字是: 千与千寻/千と千尋の神隠し/神隐少女(台)/千与千寻的神隐
导演主演: 导演:宫崎骏HayaoMiyazaki主演:柊瑠美RumiHîragi/入野自由Miy...2001/日本/剧情动画奇幻
电影评分: 9.4
----------------分割线-----------------
"""