python爬虫的简单复习1【使用etree进行XPath解析】

news2025/1/12 15:53:09

一、相关知识

1.1 etree的使用

1.1.1 编码流程

  1. 将HTML文本加载到etree对象中

  1. 调用etree的xpath()函数完成标签定位

  1. 对标签为所欲为(此时获得的标签其实是xpath()函数返回的对象)

1.1.2 环境安装

pip install lxml

1.1.3 实例化etree对象

# 首先导入模块
from lxml import etree
  • 从本地加载HTML

filePath='你的HTML文件路径'
tree=etree.parse(filePath)
  • 从响应数据加载HTML

url='某个网址'
import requests
respose=requests.get(url)
tree=etree.HTML(respose.text)

1.2 XPath语法

XPath相关知识详见: https://www.runoob.com/xpath/xpath-syntax.html
xpath('xpath表达式'):
-/:最左侧的斜杠表示从根节点开始定位,中间的斜杠表示的是一个层级
-//:中间的//表示的是多个层级,最左侧的//表示从任意位置开始定位
-属性定位://tag[@属性名称='属性值']
-索引定位://tag[@属性名称='属性值']/p[3] ==> 索引从1开始
-取文本:
-/text():获取的是标签中直系的文本内容
-//text():获取的的是标签下所有的文本内容
-取属性值:
-/@属性名字

1.3 XPath简单举例

HTML文件内容:

#test.html文件中的内容
 
 
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>测试bs4</title>
</head>
<body>
    <div>
        <p>百里守约</p>
    </div>
    <div class="song">
        <p>李清照</p>
        <p>王安石</p>
        <p>苏轼</p>
        <p>柳宗元</p>
        <a href="http://www.song.com/" title="赵匡胤" target="_self">
            <span>this is span</span>
        宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
        <a href="" class="du">总为浮云能蔽日,长安不见使人愁</a>
        <img src="http://www.baidu.com/meinv.jpg" alt=""/>
    </div>
    <div class="tang">
        <ul>
            <li><a href="http://ww.baidu.com" title= "ging">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li>
            <li><a href="http://ww.163 .com" title="gin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li>
            <li><a href="http://ww.126.com" alt= "qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
            <li><a href="http://www.sina.com" class="du">杜甫</a></li>
            <li><a href="http://www.dudu.com" class="du">杜牧</a></li>
            <li><b>杜小月</b></li>
            <li><i>度蜜月</i></li>
            <li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li>
        </ul>
    </div>
</body>
</html>

测试代码:

from lxml import etree
 
if __name__ == '__main__':
    #实例化一个对象,且将解析的源码加载到该对象中
    tree=etree.parse('test.html')
 
    print(tree.xpath('/html/head/title'))#从根目录开始遍历html,html>head>title
    print(tree.xpath('/html//title'))#同上,这里的//表示的是多个层级
    print(tree.xpath('//div'))#最左侧的//表示从任意位置开始定位title
    print(tree.xpath('//div[@class="song"]'))#class属性定位
    print(tree.xpath('//div[@class="song"]/p[3]'))#索引定位,索引下标从1开始
    print(tree.xpath('//div[@class="tang"]/ul/li[5]/a/text()')[0])#杜牧
    print(tree.xpath('//li[7]/i/text()'))#返回的是列表['度蜜月'],若想拿值,可以加上[0]
    print(tree.xpath('//li[7]//text()'))  # 同上
    print(tree.xpath('//div[@class="song"]/img/@src')[0])#取属性值
 

运行结果:

二、案例-爬取豆瓣电影以及评分

2.1 网页分析

2.1.1 背景介绍

要爬取的网站: https://movie.douban.com/

2.1.2 页面分析

获取li标签:'//*[@id="screening"]/div[2]/ul/li'获得的是一个li标签列表

获取电影名字:''@data-title' ==>直接获取属性值

【或者】'./ul/li[@class="title"]/a/text()' ==>获取标签文本

获得详情页的url:'./ul/li[@class="poster"]/a/@href'

进入详情页后操作类似于上面几步:

2.2 代码

import requests
from lxml import etree

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'}
url="https://movie.douban.com/"
res = requests.get(url, headers=header)
# 将相应数据加载到etree对象
tree=etree.HTML(res.text)
li_list=tree.xpath('//*[@id="screening"]/div[2]/ul/li')

for li in li_list:
    name=li.xpath('@data-title')[0]#获取属性值
    rate=li.xpath('@data-rate')[0]
    print('电影名字:',name)
    print('电影评分:',rate)
    #进入详情页
    detail_url=li.xpath('./ul/li[@class="poster"]/a/@href')[0]
    detail_res=requests.get(detail_url,headers=header)
    new_tree=etree.HTML(detail_res.text)
    new_span_list=new_tree.xpath('//div[@id="info"]/span')
    detail_info=dict()
    for span in new_span_list:
        name=span.xpath('./span[1]/text()')[0]
        value=span.xpath('./span[2]//text()')[0]
        print("%s:%s"%(name,value))

    break

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优思学院|如何更有效地进行5why分析(五问法)?

所谓5-why&#xff08;五个为什么或五问法&#xff09;&#xff0c;意思是要问五次 "为什么"&#xff0c;直到你找到问题的根本原因。具体的过程是&#xff1a;首先确定问题&#xff0c;然后回答"为什么"&#xff0c;并记录答案。第二次回答"为什么&q…

虚拟串口及其在串口转以太网中的应用

本文介绍虚拟串口的概念&#xff0c;以及如何在串口转以太网中利用该技术。 1.虚拟串口的概念 虚拟串口是用操作系统的虚拟驱动技术产生的串口&#xff08;COM口&#xff09;&#xff0c;相对于计算机本身的硬件串口&#xff08;COM1等&#xff09;来说虚拟串口并不对应一个物…

贪心法讲解

目录 一、前言 二、贪心法 1、优缺点 2、例子&#xff1a;最少硬币问题 3、贪心和动态规划 4、例题&#xff1a;快乐司机&#xff08;lanqiaoOJ题号1513&#xff09; 5、例题&#xff1a;旅行家的预算&#xff08;lanqiaoOJ题号775&#xff09; 三、例题 1、翻硬币&am…

数据结构:线性表的类型定义

线性表的类型定义 线性表是最简单、也是最基本的一种线性数据结构。它有两种存储表示方法&#xff1a;顺序表和链表&#xff0c;它的主要基本操作是插入、删除和查找。 线性表是n(n>0)个数据元素的有限序列&#xff0c;表中各个数据元素具有相同特性&#xff0c;即属同一数…

LeetCode 114. 二叉树展开为链表

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 114. 二叉树展开为链表&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 Leet…

2021年大数据挑战赛A题智能运维中的异常检测与趋势预测

2021年大数据挑战赛 A题 智能运维中的异常检测与趋势预测 原题再现&#xff1a; 异常检测&#xff08;异常诊断/发现&#xff09;、异常预测、趋势预测&#xff0c;是智能运维中首当其冲需要解决的问题。这类问题是通过业务、系统、产品直接关联的 KPI 业务指标进行分析诊断&…

MD语法 官方参考

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Python小技巧:if __name__ == “__main__“ 的作用

前言 这里是Python小技巧的系列文章。这是第一篇&#xff0c;if __name__ "__main__" 的作用。 在编写Python程序时候&#xff0c;总是习惯性的在文件的末尾添加这么一段代码。 if __name__ "__main__":...至于它的作用是什么&#xff0c;先不管&#x…

内网渗透-src挖掘-外网打点到内网渗透-3层内网渗透测试记录(2)-2023年1月

1、确定目标之后&#xff0c;先进行信息搜集 对目标的先进行ip端口扫描&#xff0c;发现开放了22和80端口 2、访问80端口,为Laravel框架 3、发现该版本为Laravel v8.78.1 (PHP v7.4.3) 漏洞库中搜索&#xff0c;发现该版本的Laravel存在&#xff0c;CVE-2021-3129-Laravel De…

免费格式转换器有哪些?这几款一定要试试

相信在现在的工作中&#xff0c;大家都或多或少需要处理一些文件&#xff0c;有时候我们需要把PDF文件转为word文件&#xff0c;还可能需要将PDF文件转为PPT文件等等&#xff0c;这个时候我们就需要选择一款好用的格式转换器&#xff0c;如果转换文件量比较大的小伙伴们还需要重…

odoo16 修改odoo加载过程

在odoo加载过程中&#xff0c;title处会显示odoo以及odoo标签图片&#xff0c; 所以我们可以进行修改&#xff0c;将其公司化 1. 修改无公司名称时显示字样 <title t-esc"title or Odoo"/> <!--路径&#xff1a;addons/web/views/webclient_templates.xml…

2022.12 青少年软件编程(Python) 等级考试试卷(一级)

2022年12月 青少年软件编程&#xff08;Python&#xff09; 等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a; 100 题数&#xff1a; 37 一、 单选题(共 25 题&#xff0c; 共 50 分) 1. 关于Python语言的注释&#xff0c;以下选项中描述错误的是&#xff1f;&#…

ThinkpadCPU锁频0.4G问题

1.问题描述 Thinkpad型号&#xff1a;E15 CPU&#xff1a;i5-10210U1.6GHz 系统&#xff1a;Win10家庭版 ThinkpadCPU锁频0.4G&#xff0c;具体是过程是今天我需要去楼下打印东西&#xff0c;要带着笔记本电脑&#xff0c;拔掉电源我就去楼下。 刚开始还是好好的&#xff0c;…

PyQt5 serial模块-串口小工具

PyQt5 serial模块-串口小工具串口简述serial模块参数方法使用模板串口工具示例串口简述 异步串行是指UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;通用异步接收/发送。UART是一个并行输入成为串行输出的芯片&#xff0c;通常集成在主…

java 基础练习 圆的面积

问题描述给定圆的半径r&#xff0c;求圆的面积。输入格式输入包含一个整数r&#xff0c;表示圆的半径。输出格式输出一行&#xff0c;包含一个实数&#xff0c;四舍五入保留小数点后7位&#xff0c;表示圆的面积。说明&#xff1a;在本题中&#xff0c;输入是一个整数&#xff…

Oracle通过数据库链连接KingbaseES

测试环境&#xff1a; ip数据库版本192.168.254.135oracle 11g192.168.254.137V008R006C005B0023 通过oracle官网得知&#xff0c;Oracle使用DG4ODBC作为连接到其他非Oracle数据库的数据网关。其原理图如下&#xff1a; 所以我们需要在Oracle服务器安装unixODBC和KingbaseES的O…

4 位硬科技创始人对谈 DevOps 硬件实战

随着 DevOps 技术更为广泛地在各行各业应用&#xff0c;从公司层面来看&#xff0c;考察的不仅仅是 DevOps 平台的技术&#xff0c;更多的是 DevOps 平台与企业产品的兼容性与企业文化能否为 DevOps 提供落地的土壤&#xff0c;这背后是商业模式、思维方式、管理理念的一系列变…

【项目实战】一文讲解车企是如何做HTTPS双向认证的

一、背景 很多主机厂都说需要做HTTPS的双向认证&#xff0c;那到底什么是双向认证呢&#xff1f; 二、什么是Https的双向认证&#xff1f; 英文是Mutual TLS HTTPS双向认证是一种安全通信方式&#xff0c;它需要在客户端和服务端之间进行双向身份验证。在这种方式中&#x…

2.浅谈计算机系统(硬件+软件)。

一、现代计算机系统是由哪两部分组成的&#xff1f;1.什么是物联网&#xff1f;2.有些计算机是非常复杂的。二、计算机系统简介。计算机系统的构成&#xff08;硬件、软件&#xff09;。三、软件。1.系统软件。2.应用软件。思维导图是清菡本人所画。一、现代计算机系统是由哪两…

C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(一)

C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(一) 测试软件: TIA PORTAL V15.1 S7-PLCSIM ADVANCED V3.0 Visual Studio 2019 如下图所示,打开S7-PLCSIM ADVANCED V3.0仿真软件,新键一个实例,设置仿真PLC的IP地址等参数,然后点击Start激活PLC, 如下图所示,…