96-爬虫XPath解析

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
----------------分割线-----------------
"""
相关推荐
喵手7 小时前
Python爬虫实战:HTTP缓存系统深度实战 — ETag、Last-Modified与requests-cache完全指南(附SQLite持久化存储)!
爬虫·python·爬虫实战·http缓存·etag·零基础python爬虫教学·requests-cache
喵手7 小时前
Python爬虫实战:容器化与定时调度实战 - Docker + Cron + 日志轮转 + 失败重试完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·容器化·零基础python爬虫教学·csv导出·定时调度
喵手10 小时前
Python爬虫实战:全站 Sitemap 自动发现 - 解析 sitemap.xml → 自动生成抓取队列的工业级实现!
爬虫·python·爬虫实战·零基础python爬虫教学·sitemap·解析sitemap.xml·自动生成抓取队列实现
iFeng的小屋10 小时前
【2026年新版】Python根据小红书关键词爬取所有笔记数据
笔记·爬虫·python
Love Song残响11 小时前
揭秘Libvio爬虫:动态接口与逆向实战
爬虫
喵手13 小时前
Python爬虫实战:构建招聘会数据采集系统 - requests+lxml 实战企业名单爬取与智能分析!
爬虫·python·爬虫实战·requests·lxml·零基础python爬虫教学·招聘会数据采集
iFeng的小屋14 小时前
【2026最新当当网爬虫分享】用Python爬取千本日本相关图书,自动分析价格分布!
开发语言·爬虫·python
数研小生14 小时前
关键词搜索京东列表API技术对接指南
大数据·数据库·爬虫
喵手14 小时前
Python爬虫实战:网页截图归档完全指南 - 构建生产级页面存证与历史回溯系统!
爬虫·python·爬虫实战·零基础python爬虫教学·网页截图归档·历史回溯·生产级方案
Blurpath住宅代理15 小时前
动态代理的五大优点:提升爬虫效率与安全性
网络·爬虫·动态ip·住宅ip·住宅代理