当前位置: 首页 > news >正文

【自用】Python爬虫学习(二):网页解析的三种方式(re、bs4、xpath)

Python爬虫学习(二)

  • 网页解析的三种方式
    • 1.正则表达式-re解析
      • 常用表达:
      • re常用函数:
      • 在html中的运用:
    • 2.BeautifulSoup解析
      • 常用语法:
      • 用法举例:
    • 3.xpath解析
      • 示例代码1:
      • 示例代码2:


网页解析的三种方式

1.正则表达式-re解析

常用表达:

正则表达式常用字符:
===============常用元字符:===============
.       匹配除换行符以外的任意字符
\w      匹配字母或数字或下划线
\s      匹配任意的空白符
\d      匹配数字
\n      匹配一个换行符
\t      匹配一个制表符^       匹配字符串的开始
$       匹配字符串的结尾\W      匹配非字母或数字或下划线
\D      匹配非数字
\S      匹配非空白符a|b     匹配字符a或字符b
()      匹配括号内的表达式,也表示一个组
[...]   匹配字符组中的字符
[^...]  匹配除了字符组中字符的所有字符===============量词:控制前面的元字符出现的次数===============
*       重复零次或更多次
+       重复一次或更多次
?       重复零次或一次
{n}     重复n次
{n,}    重复n次或更多次
{n,m}   重复n到m次===============贪婪匹配和情性匹配===============
.*      贪婪匹配
.*?     情性匹配

re常用函数:

import re# re.findall(正则表达式,字符串),:匹配字符串中所有的符合正则的内容,返回的结果是一个列表
print("===============findall():===============")
lis = re.findall(r'\d+', '我的电话号码是10086,小明的电话是10010')
print(lis)
# ['10086', '10010']# finditer():匹配字符串中所有的内容【返回的是选代器】,从迭代器中拿到内容需要:group(),效率更高
print("===============finditer():===============")
it = re.finditer(r'\d+', "我的电话号是:10086,小明的电话是:10010")
for i in it:print(i.group())
# 10086
# 10010# search()找到一个结果就返回,返回的是match对象,拿数据需要.group()
print("===============search():===============")
s = re.search(r'\d+', "我的电话号是:10086,小明的电话是:10010")
print(s.group())
# 10086# match是从头开始匹配
print("===============match():===============")
m = re.match(r'\d+', "10086,小明的电话是:10010")
print(m.group())
# 10086# 预加载正则表达式
print("===============预加载正则表达式:===============")
obj = re.compile(r"\d+")
ret = obj.finditer("我的电话号是:10085,小明的电话是:10000")
for it in ret:print(it.group())
# 10085
# 10000

在html中的运用:

import retext = """
<div class='jay'><span id='1′>郭某某</span></div>
<div class='jj'><span id='2′>宋某某</span></div>
<div class='jolin'><span id='3′>李某某</span></div>
<div class='sylar'><span id='4′>范某某</span></div>
<div class='tory'><span id='5′>刘某某</span></div>"""
# (?P<分组名字>正则)可以单独从正则匹配的内容中进一步提取内容,re.S的作用是让.能匹配换行符
obj = re.compile(r"<div class='.*?><span id='(?P<num>\d+)′>(?P<name>.*?)</span></div>", re.S)result = obj.finditer(text)
for it in result:print(it.group())# <div class ='jay' > < span id='1′>郭某某</span></div>print(it.group('name'))# 郭某某print(it.group('num'))# 1

2.BeautifulSoup解析

常用语法:

"""
-如何实例化BeautifulSoup对象:-from bs4 import BeautifulSoup-对象的实例化:-1.将本地的htmL文档中的数据加载到该对象中fp=open('./test.html','r',encoding='utf-8')soup=BeautifulSoup(fp,'lxml')2.将互联所网上获取的页面源码加载到该对象中page_text=response.textsoup=BeautifulSoup(page_text,'lxml')-提供的用于数据解析的方法和属性:-soup.tagName:返回的是文档中第一次出现的tagName对应的标签-soup.find():-find('tagName'):等同于soup.div-属性定位-soup.find('div',class_/id/attr='song')-soup.find_all('tagName'):返回符合要求的所有标签(列表)-select:-select('某种选择器(id,class,标签……选择器)'),返回的是一个列表。-层级选择器:-soup.select('.tang>ul>li>a'):>表示的是一个层级-soup.select('.tang>ul a'):空格表示的多个层级-获取标签之间的文本数据:-soup.a.text/string/get_text()-text/get_text():可以获取某一个标签中所有的文本内容-string:只可以获取该标签下面直系的文本内容·-获取标签中属性值:-soup.a['href']"""

用法举例:

import requests
from bs4 import BeautifulSoupurl = ''
hearders = {'User-Agent': ''
}
resp = requests.get(url=url, headers=hearders)
# 对象的实例化
soup = BeautifulSoup(resp.text, 'lxml')
# 标签定位
# 返回的是文档中第一次出现的tagName对应的标签
div_first1 = soup.find('div')
div_first2 = soup.div
# div_first1与div_first2效果一样# 属性定位
# 写法1,添加下划线'class_'规避关键字class
soup.find('div', class_='song')
# 写法2,写成字典形式
soup.find('div', attrs={"class": "song"})# 返回符合要求的所有标签(列表)
soup.find_all('tagName')# 层级选择器,返回的是一个列表
# >表示的是一个层级
soup.select('.tang > ul > li > a')
# 空格表示的多个层级
soup.select('.tang > ul a')# 获取标签之间的文本数据
"""
……
<div><p>段落</p>内容测试<a href='www.baidu.com'>百度</a><a href='www.bing.com'>必应</a>
</div>
……
"""
# 可以获取某一个标签中所有的文本内容
div_text1 = soup.div.text  # 结果包含:段落 内容测试 百度 必应
div_text2 = soup.div.get_text()  # 结果包含:段落 内容测试 百度 必应# 只可以获取该标签下面直系的文本内容
# <a href='wwww.baidu.com'>百度</a>
a_text3 = soup.a.string  # 百度# 获取标签中属性值:
# 获取<a href='wwww.baidu.com'>百度</a>中的href链接文本
# 方法1
web_links = soup.a['href']  # wwww.baidu.com
# 方法2
web_page = BeautifulSoup(resp.text, "html.parser")
div_list = web_page.find('div', class_='big-pic')
image_src = div_list.find('img').get('src')  # 用get拿到标签的对应属性

3.xpath解析

示例代码1:

from lxml import etreexml = """
<book><id>1</id><name>野花遍地香</name><price>1.23</price><nick>臭豆腐</nick><author><nick id="10086">周大强</nick><nick id="10010">周芷若</nick><nick class="joy">周杰伦</nick><nick class="jolin">蔡依林</nick><div><nick>惹了1</nick></div><span><nick>惹了2</nick><div><nick>惹了3</nick></div></span></author><partner><nick id="ppc">胖胖陈</nick><nick id="ppbc">胖胖不陈</nick></partner></book>"""tree = etree.XML(xml)
# result = tree.xpath("/book")
result = tree.xpath("/book/name/text()")  # ['野花遍地香']
# -/text()取的是标签中直系的文本内容;//text()标签中非直系的文本内容(所有的文本内容)result = tree.xpath("/book/author/nick/text()")
# ['周大强', '周芷若', '周杰伦', '蔡依林']
result = tree.xpath("/book/author/div/nick/text()")
# ['惹了1']
result = tree.xpath("/book/author//nick/text()")
# ['周大强', '周芷若', '周杰伦', '蔡依林', '惹了1', '惹了2', '惹了3']
result = tree.xpath("/book/author/*/nick/text()")
# *任意的节点,通配符,['惹了1', '惹了2']result = tree.xpath("/book//nick/text()")
# ['臭豆腐', '周大强', '周芷若', '周杰伦', '蔡依林', '惹了1', '惹了2', '惹了3', '胖胖陈', '胖胖不陈']print(result)

示例代码2:

"Test.html"文件内容如下所示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" /><title>Title</title>
</head>
<body>
<ul><li><a href="http://www.baidu.com">百度</a></li><li><a href="http://www.google.com">谷歌</a></li><li><a href="http://www.sogou.com">搜狗</a></li>
</ul>
<ol><li><a href="feiji">飞机</a></li><li><a href="dapao">大炮</a></li><li><a href="huoche">火车</a></li>
</ol><div class="job">李嘉诚</div>
<div class="common">胡辣汤</div></body>
</html>
from lxml import etree# 读取Test.html文件
tree = etree.parse("Test.html")
result = tree.xpath('/html')result1 = tree.xpath("/html/body/ul/li/a/text()")
# ['百度', '谷歌', '搜狗']
print(result1)# 注意这里的xpath的索引是从1开始的,li[1]代表取第一个,[]中数字代表索引
result2 = tree.xpath("/html/body/ul/li[1]/a/text()")
# ['百度']
print(result2)result3 = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()")
# ['大炮']
print(result3)ol_li_list = tree.xpath("/html/body/ol/li")for li in ol_li_list:# 从每一个1i中提取到文字信息result = li.xpath("./a/text()")  # 在li中继续去寻找,相对查找,注意用./print(result)# 拿到属性值:@属性值result2 = li.xpath("./a/@href")  # 在li中继续去寻找,获取到属性href的值print(result2)print(tree.xpath("/html/body/ul/li/a/@href"))
# ['http://www.baidu.com', 'http://www.google.com', 'http://www.sogou.com']print(tree.xpath("/html/body/div/text()"))
# ['李嘉诚', '胡辣汤']

相关文章:

【自用】Python爬虫学习(二):网页解析的三种方式(re、bs4、xpath)

Python爬虫学习&#xff08;二&#xff09; 网页解析的三种方式1.正则表达式-re解析常用表达&#xff1a;re常用函数&#xff1a;在html中的运用&#xff1a; 2.BeautifulSoup解析常用语法&#xff1a;用法举例&#xff1a; 3.xpath解析示例代码1&#xff1a;示例代码2&#xf…...

从零到一:家政保洁小程序搭建全攻略与功能作用深度解析

目录 一、家政保洁小程序主要功能 二、家政保洁小程序搭建教程 &#xff08;一&#xff09;前期准备 &#xff08;二&#xff09;注册与选择工具 &#xff08;三&#xff09;设计与开发 &#xff08;四&#xff09;测试与优化 &#xff08;五&#xff09;发布与推广 一、…...

单元测试:为工程质量保驾护航

单元测试 单元测试是软件开发过程中确保代码质量和正确性的关键手段。它指的是对软件中的最小可测试单元&#xff08;通常是函数或方法&#xff09;进行验证&#xff0c;确保其行为符合预期。 基本概念 单元测试&#xff1a;验证软件中最小单元&#xff08;通常是函数或方法…...

江协科技STM32学习笔记

第01章 STM32简介及开发环境搭建 1.1 STM32简介 1.1.1 STM32F103C8T6 系列&#xff1a;主流系列STM32F1 内核&#xff1a;ARM Cortex-M3 主频&#xff1a;72MHz RAM&#xff1a;20K&#xff08;SRAM&#xff09; ROM&#xff1a;64K&#xff08;Flash&#xff09; 供电…...

RabbitMQ再回首--往事如梦

这文章你就读吧&#xff0c;越读越&#x1f978;&#xff0c;一读一个不吱声 可靠的&#x1f430;警官&#xff1a;rabbitMQ&#xff0c;功能全面&#xff0c;不丢数据&#xff0c;体量小&#xff0c;容易堆积 声明exchange channel . exchangeDeclare ( String exchange , …...

头狼择校小程序

综述介绍 头狼择校&#xff0c;是头狼择™高校的简称&#xff0c;我们专注高校、大学的择校。倡导先嗅就业再择校&#xff0c;是预约工具和对话平台。帮您嗅招办、嗅教授、嗅学姐&#xff0c;预约择校有关的老师、顾问&#xff0c;助力考大学和考研的“双考”学生及家长了解就…...

【Electron】npm安装Electron项目失败报错问题和解决办法

前言 闲来无事&#xff0c;便想着研究一下Electron&#xff0c;没想到安装直接就卡住了 问题 npm ERR! RequestError: Hostname/IP does not match certificates altnames: Host: npm.taobao.org. is not in the certs altnames: DNS:*.tbcdn.cn, DNS:*.taobao.com, DNS:*.al…...

人工智能提示(prompt)工程入门

文章目录 人工智能提示&#xff08;prompt&#xff09;工程入门一、目的二、使用1、角色2、提示3、上下文4、例子5、输入6、输出 三、使用示例 人工智能提示&#xff08;prompt&#xff09;工程入门 一、目的 对于当前的发达的人工智能&#xff0c;我们可以广泛使用&#xff0…...

【机器学习的基本思想】模型优化与评估

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…...

公司电脑监控软件推荐(一口气了解8款!)一起领略电脑监控界的刀光剑影!

企业的内部管理的需求日益复杂&#xff0c;电脑监控软件作为提升工作效率、保障数据安全的重要工具&#xff0c;其重要性不言而喻。今天&#xff0c;我们将带您一口气了解8款顶尖的公司电脑监控软件&#xff0c;包括国内知名的“安企神”以及多款来自海外的优秀产品&#xff0c…...

设备图纸资料管理系统:数字化转型下的高效协同与安全管理新篇章

在当今高度信息化的时代&#xff0c;设备图纸资料管理系统作为企业资产与知识管理的重要一环&#xff0c;正日益凸显其不可或缺的价值。这一系统集成了先进的数字化技术与管理理念&#xff0c;旨在实现设备图纸资料的高效存储、快速检索、安全共享及版本控制&#xff0c;为企业…...

ArcGIS基础:标注转注记及简单处理

注记是一个静态的标签图层&#xff0c;能够独立的保存为文件&#xff0c;并且具有计算功能&#xff1b; 标注是一个动态的标签图形&#xff0c;无法以文件的形式进行存储和计算&#xff1b; 2者各有优势和劣势&#xff0c;根据具体需求进行选择 需要注意的是注记要存储在GDB…...

jQuery实现图片轮播效果

实现图片轮播效果&#xff0c;打开页面&#xff0c;每隔3秒切换至下一张图片&#xff1b;光标移入数字时&#xff0c;播放相应图片。 思路&#xff1a; &#xff08;1&#xff09;获取需要轮播的图片和展示的div。 &#xff08;2&#xff09;使用animate设置left值&#xff…...

关于天地图新手使用

1分钟带你了解学习天地图 适用新手 天地图API (tianditu.gov.cn) 文档api 先去注册key 把脚本放到index.html文件里面 <!-- 天地图的官网申请的tk --> <script src="http://api.tianditu.gov.cn/api?v=4.0&tk=申请的key" type="text/javascr…...

STM32与Arduino和ESP32对比分析

在嵌入式系统领域&#xff0c;STM32、Arduino 和 ESP32 是三种广泛使用的微控制器平台。它们各自具有独特的优势&#xff0c;适用于不同类型的项目。本文将详细比较这些平台&#xff0c;帮助您了解它们之间的差异、优势以及可能的应用场景。 一、架构与处理能力 STM32&#xf…...

125. 验证回文串【 力扣(LeetCode) 】

一、题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b…...

3年经验,面试测试岗20k都拿不到了吗?

我的情况 大概介绍一下个人情况&#xff0c;女&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而到今天都没有收到一份offer&#xff01;从年后就开始准备简历&#xff0c;年…...

【ML】强化学习(Reinforcement Learning)及其拆解

【ML】强化学习&#xff08;Reinforcement Learning&#xff09; 1. RL Outline 强化学习&#xff08;Reinforcement Learning&#xff09;概述1.1 RL的基本框架 2. RL 引入&#xff1a;从这个小游戏开始3. Policy Gradient 方法4. Actor-Critic 方法5. [奖励塑形&#xff08;R…...

在宝塔面板下安装WordPress

宝塔面板是服务器管理好助手&#xff0c;尤其在Linux系统下&#xff0c;提高了管理的可视化&#xff0c;降低了Linux服务器的使用门槛。 WordPress是个非常好的博客系统&#xff0c;由于支持海量主题模板、各种类型的插件&#xff0c;因此已经成为建设各类网站的首选框架。 今…...

纷享销客CRM AI产品架构概览、产品特色

一、纷享销客CRM AI产品架构概览 纷享AI平台架构分为三个主要层次&#xff1a;AI基础设施层、AI平台层和AI应用层。每个层次都由一系列功能模块组成&#xff0c;旨在为客户提供强大的技术支持和灵活的解决方案。 1.Al基础设施层 AI基础设施层是整个AI平台的底层支撑&#xff…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...