原创于2022/10/24。修改:2022/11/5。

在用Python爬网页抓取文字时有各种方法:BeautifulSoup、xpath、find_element、re正则表达式等。如何实现从一个指定的位置开始查找,需要花时间琢磨代码。我从中国银行最新汇率的网页爬汇率数据来练手,思路很简单,先找到页面中的美元,然后从美元这个位置开始找旁边的汇率数据。

各位大佬看到这里可能会说,这超级简单啊,上面的BeautifulSoup、xpath、find_element随便一个都能拿下来。别人造好的车轮都有得卖,为什么还要自己造一个?但是我的目的是不借助其它库的函数,只用Python自带的find来实现,重新造一个适合自己用的代码,如果编译成exe也可尽量缩小exe的大小。

import requestsdef my_find(string,from_where,start_str,end_str):# 参数说明:# string:源字符串# from_where:从哪里开始找,类型可以是字符串,也可以是整数(整数意味着具体位置)# start_str:要找的关键词的开头# end_str:要找的关键词的结尾t1=string.find(from_where)+len(from_where) if type(from_where)==str else from_wheret2=string.find(start_str,t1)+len(start_str)t3=string.find(end_str,t2)if t1==-1 or t2==-1 or t3==-1:return ''else:return string[t2:t3],t3+len(end_str) # 返回字符串以及最后一次查找的位置url='https://www.boc.cn/sourcedb/whpj/'
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',}
res=requests.get(url,headers=headers)
res.encoding='utf-8'
res=res.text
print('今天汇率:\n币种\t现汇买入价\t现钞买入价\t现汇卖出价\t现钞卖出价\t中行折算价\n'+'-'*85)
for i in ['美元','港币','欧元','英镑','卢布','日元']:# 第一次找指定币种旁边的汇率数据my_str=my_find(res,"<td>"+i+"</td>","<td>","</td>")# 返回的结果类型是元组,元素分别是汇率数据、查找的位置# 先输出第一个汇率数据,my_str后面要有[0]print(i+':\t'+my_str[0],end='\t\t')# 然后从上一次查找的位置顺着查找同一行其他四列的汇率数据# 这时my_find函数第二个参数my_str[1]是上一次查找的位置for j in range(4):my_str=my_find(res,my_str[1],"<td>","</td>")print(my_str[0],end='\t\t')print()

上述my_find函数代码中的t1、t2、t3图解:

运行结果截图(注:下面截图是2022/11/5的汇率数据,上面截图中的汇率数据是2022/10/24):

以上是我自己造的“车轮”。下面示范一下用现成的“车轮”(比如xpath)来查找文字,首先查找汇率页面中的“美元”,定好位再顺藤摸瓜找下一级数据,代码为:

# 定位td标签内容中含有“美元”的标签
//td[contains(text(),"美元")]
# 从含有“美元”字样的下一级td标签抓取文字
//td[contains(text(),"美元")]/following-sibling::td[1]/text()

xpath需要先从lxml库引入etree:from lxml import etree。

import requests
from lxml import etreeurl='https://www.boc.cn/sourcedb/whpj/'
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',}
res=requests.get(url,headers=headers)
res.encoding='utf-8'
res=res.text
html=etree.HTML(res)
print('今天汇率:\n币种\t现汇买入价\t现钞买入价\t现汇卖出价\t现钞卖出价\t中行折算价\n'+'-'*85)
for i in ['美元','港币','欧元','英镑','卢布','日元']:print(i+':',end='\t')for j in range(1,6):print(html.xpath('//td[contains(text(),"'+i+'")]/following-sibling::td['+str(j)+']/text()')[0],end='\t\t')print()

使用xpath做匹配字符串的表达式晦涩难懂,需要多花时间理解。例一代码的my_find()是自己写的,容易理解,只是在某些复杂情况下可能不奏效。

我将以上两个例子的代码分别编译成exe文件(在虚拟环境中编译,以求最小的exe体积),exe体积分别是:

例一(自编函数):    7.03MB

例二(引入lxml库):  9.43MB

自编一个从指定位置开始查找字符串的Python代码相关推荐

  1. php输出到特定位置,如何使用php从指定位置开始替换字符串

    如何使用php从指定位置开始替换字符串 发布时间:2020-08-03 16:10:19 来源:亿速云 阅读:146 作者:Leah 本篇文章给大家分享的是有关如何使用php从指定位置开始替换字符串, ...

  2. c语言两个字符串比较,将两个字符串s1和s2比较,如果s1s2,作业 - 编一个程序,将两个字符串s1和s2比较,如果.doc...

    作业 - 编一个程序,将两个字符串s1和s2比较,如果 作业(第一次) 求下面表达式的值: x+a%3*(int)(x+y)%2/4 设x=2.5,a=7,y=4.7 (float)(a+b)/2+( ...

  3. JS字符串截取方法 JS字符串查找指定字符方法 JS字符串替换指定字符方法 JS字符串插入指定位置方法 JS字符串删除指定字符方法

    js字符串截取的方法 方法一: str.slice(开始位置,结束位置) //start 参数字符串中第一个字符位置为 0, 第二个字符位置为 1, 以此类推,如果是负数表示从尾部截取多少个字符串,s ...

  4. java查找字符位置_java 查找字符串所在的位置代码

    使用了 string 类的 indexof() 方法在字符串中查找子字符串出现的位置,如过存在返回字符串出现的位置(第一位为0),如果不存在返回 -1.方便判断和截取字符串! 语法:stringobj ...

  5. python替换指定位置word图片_用Python在word的指定位置插入图片(使用Python-docx包)...

    1 2 首先,本实例是采用java语言的,需要进行xml操作,至于poi,docx4j这些,因为感觉不是文档不太好,要嘛就是操作不方便,而且英文就算了,主要是注释很少,让人云里雾里的.所以,嘿嘿,直接 ...

  6. mysql查找字符串最后位置_mysql查找字符串出现位置

    标签: MySQL中的LOCATE和POSITION函数使用方法 FIND_IN_SET(str,strlist) 假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 ...

  7. mysql 字符位置_mysql查找字符串出现位置

    MySQL中的LOCATE和POSITION函数使用方法 FIND_IN_SET(str,strlist) 假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 ...

  8. 【字符串操作之】返回指定位置的字符和Unicode 字符代码 根据unicode返回字符→→charAt、charCodeAt和fromCharCode...

    //charAt和charCodeAt分别返回指定位置处的字符和字符对应的unicode码 var str:String="abcdefg"; var str2=str.charA ...

  9. python中如何编写代码输入多个数据并把它们放在一个列表中去_编写高质量Python代码的59个有效方法,你用过几个...

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 这个周末断断续续的阅读完了<Effectiv ...

  10. 又一个Jupyter神器,操作Excel自动生成Python代码

    来源 | Python数据科学(ID: PyDataScience) 不得不说,Jupyter对于表的处理真的是越来越方便了,很多库可以直接实现可视化操作,无需写代码.但是这还不够,最近看到一个神器叫 ...

最新文章

  1. 异常检测算法:Isolation Forest
  2. Gartner预测2015年的十大IT战略发展趋势
  3. lintcode:形状工厂
  4. Springmvc 中org.springframework.http.converter.json.MappingJackson2HttpMessageConverter依赖jackson包...
  5. System.Collections深入探讨--如何创建自定义的集合类
  6. phpstorm 设置注释
  7. OpenCV-python安装教程
  8. [高通MSM8953_64][Android10]新增并挂载custom分区
  9. PMP-我是如何两周拿下5A的
  10. 图像处理算法工程师必备技能总结
  11. 典型分布式计算技术的分析和比较
  12. hive 神盾特工局_详解漫威电影宇宙历史(一)宇宙初创到泰坦星的陨落
  13. 用计算机对视频进行剪裁和编辑,Win10系统剪裁视频功能怎么用?windows10剪裁视频功能使用方法介绍...
  14. 数字图像处理|Matlab-数字图像编码实验-有损压缩/压缩算法实验-JPEG编码压缩
  15. php类型 fcgi,php -v显示cgi-fcgi
  16. live2d动态壁纸android,live2dviewerex宅男自定义动态壁纸下载-live2dviewerex动态桌面2.0.4 官方安卓版下载_东坡手机下载...
  17. Arm 为智能摄像头提供安全的计算机视觉
  18. 腾讯T3整理分享的LeetCode算法小抄完整文档
  19. 干货!微商必备4大软件
  20. Redis官网下载步骤(含windows版)

热门文章

  1. SAP BAPI_EXCHANGERATE_GETDETAIL 读取货币汇率
  2. android渠道 积分墙,安卓推广:既然能在应用商店做CPD,为什么还一定要做积分墙?...
  3. 模拟文曲星上的猜数游戏c语言,文曲星上的“猜数字”游戏Python版
  4. 逐步分析类的拆分之案例——五彩斑斓的小球碰撞
  5. The retrospective material for unit_4 Survival
  6. php 教育类,php教育培训网站是哪个
  7. java protected 构造方法_Java中protected语义解释
  8. GkCTF2020逆向部分wp
  9. 学习Kruskal并用其解决洛谷P1195口袋的天空
  10. C++代码静态分析与优化(10)_rats