第14.11节 Python中使用BeautifulSoup解析http报文:使用查找方法快速定位内容

2023-11-04

一、 引言
在《第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问》介绍了BeautifulSoup对象的主要属性,通过这些属性可以访问标签、内容,但这种方法要么就只能访问符合条件的第一个对象,要么需要遍历访问对象,某些情况下不能通过指定特征快速定位标签和内容。本节将介绍使用BeautifulSoup提供的相关方法快速定位标签和内容的方法。本节继续复用《第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问》中的HTML文件和对象定义代码。
本节案例中介绍处理的c:\temp\s1.html文件内容如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<style type="text/css">	.textline{color:blue;}</style>
<link href="https://blog.csdn.net/LaoYuanPython/article/details/95360624" rel="canonical"/>
<title>BeautifulSoups使用方法 - 老猿Python - CSDN博客 </title></head>
<body> 	
  <h1>老猿Python</h1>
	<div><p class="textline" name="line1"> 老猿Python首行</p></div>
	<div>
	<h2>老猿Python第二行<a href="https://blog.csdn.net/LaoYuanPython" /> </h2>
	<h3><b>老猿Python第三行</b><a href="https://blog.csdn.net/LaoYuanPython" /> </h3>
  </div>	
</body></html>

创建soup对象的代码如下:

>>> from bs4 import BeautifulSoup
>>> def getsoup():
    fp = open(r'c:\temp\s1.html',encoding='utf-8')
    soup = BeautifulSoup(fp, 'lxml')
    fp.close()
    print(soup)
    return soup

>>> soup=getsoup()

二、 方法find_all
find_all() 方法搜索当前标签的所有子节点,并判断是否符合过滤器的条件,非标签标记的字符串对象会被自动忽略掉。
1、 调用语法:find_all( name , attrs , recursive , string ,limit, **kwargs )
2、 name 参数:匹配过滤器,用于查找所有名字满足name过滤器 的标签。 过滤器有几种类型:
1)字符串:传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的标签名,注意是完整匹配,不是模糊匹配;

>>> soup.find_all('link')
[<link href="https://blog.csdn.net/LaoYuanPython/article/details/95360624" rel="canonical"/>]
>>>

2)正则表达式:传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配标签名。注意在这个地方传入必须是re.compile的匹配模式,如果是匹配字符串Python会认为是字符串匹配。

>>> soup.find_all(re.compile('h[1-2]'))
[<h1>老猿Python</h1>, <h2>老猿Python第二行<a href="https://blog.csdn.net/LaoYuanPython"></a> </h2>]


3)列表:传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回;

>>> soup.find_all(['h1','h2'])
[<h1>老猿Python</h1>, <h2>老猿Python第二行<a href="https://blog.csdn.net/LaoYuanPython"></a> </h2>]
>>>

4)True:True 可以匹配任何标签,将查找所有的标签;
5)方法:传一个方法,该方法只有一个标签参数,通过这个方法对标签进行一些校验,满足条件返回 True 表示当前元素匹配并且被找到,如果不是则返回 False。如:

>>> def findline(tag):

    if tag==None: return False
    content=tag.attrs.get('name')
    if content==None:return False
    return re.match('line',content)!=None

>>> soup.find_all(findline)
[<p class="textline" name="line1"> 老猿Python首行</p>]
>>>

Beautiful Soup官网文档地址:https://beautifulsoup.readthedocs.io/zh_CN/latest/给了个例子:

def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')

将这个方法作为参数传入 find_all() 方法,将得到所有有class属性但无id属性的标签。
3、 kwargs参数
如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字标签的属性来搜索。如包含一个名字为 id 的参数,Beautiful Soup会搜索每个标签的”id”属性。

搜索方法语法如下:
属性id=匹配过滤器

其中属性id要求是个合法的Python标识符,否则需要使用attrs参数才能进行匹配。匹配过滤器与name参数类似,稍有差别,主要是不支持列表方式传参,同时其匹配的内容是属性id对应的值,而不是标签或属性id,匹配是去查看对应属性的值是否满足条件。

1)根据属性值的字符串来匹配,注意是必须完全相同,如:

>>> soup.find_all(rel='canonical')
[<link href="https://blog.csdn.net/LaoYuanPython/article/details/95360624" rel="canonical"/>]

2)根据属性值的正则表达式使用match来匹配,如:

>>> soup.find_all(href=re.compile('.*'))
[<link href="https://blog.csdn.net/LaoYuanPython/article/details/95360624" rel="canonical"/>, <a href="https://blog.csdn.net/LaoYuanPython"></a>, <a href="https://blog.csdn.net/LaoYuanPython"></a>]
>>> 

3)属性ID=True来匹配所有有该属性的标签,如:

>>> soup.find_all(rel=True)
[<link href="https://blog.csdn.net/LaoYuanPython/article/details/95360624" rel="canonical"/>]
>>> soup.find_all(href=True)
[<link href="https://blog.csdn.net/LaoYuanPython/article/details/95360624" rel="canonical"/>, <a href="https://blog.csdn.net/LaoYuanPython"></a>, <a href="https://blog.csdn.net/LaoYuanPython"></a>]
>>>

4)方法:传一个方法,该方法只有一个参数,这个参数在调用时传递的实参时对应属性ID的属性值,通过这个方法对属性值进行一些校验,满足条件返回 True 表示当前元素匹配并且被找到,如果不是则返回 False

>>> def gethrefinludeaticle(value):
	if value==None:return False
	return re.findall('article',value)

>>> soup.find_all(href=gethrefinludeaticle)
[<link href="https://blog.csdn.net/LaoYuanPython/article/details/95360624" rel="canonical"/>]
>>>

注意:经老猿验证测试,发现在校验函数调用前,系统并没有先进行属性id的匹配成功再调用校验函数,而是所有标签属性匹配失败也会进入校验函数再校验,此时因为匹配失败value为None,因此对校验函数的参数进行None的判断非常重要。如果我们将value的情况输出,可以清楚看到函数的调用情况。如:

>>> def gethrefinludeaticle(value):
	if value==None:
		print("None")
		return False
	else:print(value)
	return re.findall('article',value)

>>> soup.find_all(href=gethrefinludeaticle)
None
None
None
https://blog.csdn.net/LaoYuanPython/article/details/95360624
None
None
None
None
None
None
None
https://blog.csdn.net/LaoYuanPython
None
None
https://blog.csdn.net/LaoYuanPython
None
None
[<link href="https://blog.csdn.net/LaoYuanPython/article/details/95360624" rel="canonical"/>]
>>>

5)属性id为Python关键字class的匹配
按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字 class 在Python中是保留字,使用 class 做参数会导致语法错误。
可以通过给class加下划线变成 class_进行搜索,如:

>>> soup.find_all(class='textline')
SyntaxError: invalid syntax
>>> soup.find_all(class_='textline')
[<p class="textline" name="line1"> 老猿Python首行</p>]

由于tag的 class 属性是 多值属性 .按照CSS类名搜索tag时,可以分别搜索tag中的每个CSS类名,如:

css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.find_all("p", class_="strikeout")
# [<p class="body strikeout"></p>]

css_soup.find_all("p", class_="body")
# [<p class="body strikeout"></p>]
搜索 class 属性时也可以通过CSS值完全匹配:

css_soup.find_all("p", class_="body strikeout")
# [<p class="body strikeout"></p>]

4、 attrs参数
根据属性id和属性值的字典来匹配,可以使用“attrs=字典”,字典的元素的键是带引号的标签属性id,在属性id不是一个合法的Python标识符情况下,可以使用这种方法来匹配。根据老猿的测试验证,注意:class不能再加下划线,字典的值可以是上面所有的匹配方法,多个字典元素是与的关系,即要找到的标签必须具有字典中所有元素对应的内容。这可是网上的资料及beatifulsoap官网都没介绍。如:

>>> def gethrefinludeaticle(value):
	if value==None:	return False
	return re.findall('article',value)

>>> soup.find_all(attrs={'href':gethrefinludeaticle,'rel':'canonical'})
[<link href="https://blog.csdn.net/LaoYuanPython/article/details/95360624" rel="canonical"/>]
>>> soup.find_all(attrs={'class':re.compile('.*')})
					    
[<p class="textline" name="line1"> 老猿Python首行</p>]
>>> soup.find_all(attrs={'class_':re.compile('.*')}) #class不能加下划线
					    
[]
>>>

5、 recursive参数
调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False。

6、 string参数
通过 string 参数可以搜搜文档中的字符串内容。与 name 参数的可选值一样, string 参数接受 字符串 , 正则表达式 , 列表, True 。
新版本该参数名为string,老版本中为text,根据老猿的验证这两个参数使用效果是一样的,不过建议使用string。 如:

>>> soup.find_all(text=re.compile('.*'))
					    
['html', '\n', '\n', '\t.textline{color:blue;}', '\n', '\n', 'BeautifulSoups使用方法 - 老猿Python - CSDN博客 ', '\n', '\n', '老猿Python', '\n', ' 老猿Python首行', '\n', '\n', '老猿Python第二行', ' ', '\n', '老猿Python第三行', ' ', '\n', '\n', '\nkeyword 参数\n如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性.\t']

>>> soup.find_all(string=re.compile('.*'))
					    
['html', '\n', '\n', '\t.textline{color:blue;}', '\n', '\n', 'BeautifulSoups使用方法 - 老猿Python - CSDN博客 ', '\n', '\n', '老猿Python', '\n', ' 老猿Python首行', '\n', '\n', '老猿Python第二行', ' ', '\n', '老猿Python第三行', ' ', '\n', '\n', '\nkeyword 参数\n如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性.\t']

7、 limit 参数
该参数在官网的方法定义中没有,但后面参数介绍中有,经过验证是可以使用的,因此老猿将其补充到参数中去了。使用 limit 参数限制返回结果的数量,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果。

8、 返回值
find_all的返回值是一个符合条件的html元素列表,每个元素就是一个符合条件的html元素。find_all()只搜索当前节点的所有子节点,孙子节点等。

三、 find_all方法的简写使用
find_all() 是Beautiful Soup中最常用的搜索方法,所以Beautiful Soup定义了它的缩写方法。具体缩写方式为:
将“BeautifulSoup对象.find_all(参数)” 缩写为“BeautifulSoup对象(参数)”
如代码:soup.find_all(“a”)与soup(“a”)是等价的,soup.title.find_all(string=True)与soup.title(string=True)等价。

四、 find
find() 搜索当前节点的所有子节点,孙子节点等是否有满足条件的元素,有则返回第一个符合条件的内容。

1. 调用语法:
find( name , attrs , recursive , string , **kwargs );

2. 语法释义:
find的几个参数与find_all中同名参数是一样的,参数含义也是一样,只是比find_all少了一个limit参数。而返回值是直接返回第一个满足条件的html元素。find_all() 方法没有找到目标是返回空列表,find() 方法找不到目标时返回 None 。某种程度上讲,find类似于find_all中参数limit=1的调用。

3.通过“对象.标签名”访问是“对象.find(”标签名”)”的简写,如:soup.head.title是soup.find(“head”).find(“title”)的简写。

五、 find_parents() 和 find_parent()
find_parents() 和 find_parent() 用来搜索当前节点的父辈节点,搜索方法与普通tag的搜索方法相同,搜索文档搜索文档包含的内容。

  1. 调用语法:
    find_parents( name , attrs , recursive , string , **kwargs )
    find_parent( name , attrs , recursive , string , **kwargs )
  2. 语法释义
    find_parents() 和 find_parent()几个参数与find_all中同名参数是一样的,参数含义也是一样,只是比find_all少了一个limit参数。
    find_parents搜索父辈节点的方法实际上就是对 parents 属性的迭代搜索,返回值是一个列表。find_parent就是返回第一个符合条件的父节点的html元素,与parent属性含义是一样,只是parent只能通过“对象.parent”方式访问,而find_parent可以去父节点中查找满足条件的父节点。

六、 find_next_siblings() 和 find_next_sibling()
这2个方法通过 next_siblings 属性查找当前标签的所有后面解析的兄弟标签节点。

  1. 调用语法:
    find_next_siblings( name , attrs , recursive , string , **kwargs )
    find_next_sibling( name , attrs , recursive , string , **kwargs )
  2. 语法释义
    相关参数的含义与find_all的同名参数含义一致,find_next_siblings() 方法返回所有符合条件的后面的兄弟节点,find_next_sibling() 只返回符合条件的后面的第一个tag节点。

七、 find_previous_siblings() 和 find_previous_sibling()
这两个方法通过 previous_siblings 属性对当前tag的前面解析的兄弟tag节点进行迭代查找满足条件的节点。

  1. 调用语法:
    find_previous_siblings( name , attrs , recursive , string , **kwargs )
    find_previous_sibling( name , attrs , recursive , string , **kwargs )
  2. 语法释义
    这2个方法的参数与find_all中同名参数用途是一样的。find_previous_siblings() 方法返回所有符合条件的前面的兄弟节点的列表,find_previous_sibling() 方法返回第一个符合条件的前面的兄弟节点。

八、 find_all_next() 和 find_next()
这2个方法通过 next_elements 属性对当前标签之后的标签和字符串进行迭代查找满足要求的数据。

  1. 调用语法:
    find_all_next ( name , attrs , recursive , string , **kwargs )
    find_next ( name , attrs , recursive , string , **kwargs )
  2. 语法释义:
    这2个方法的参数与find_all中同名参数用途是一样的。find_all_next() 方法返回所有符合条件的节点, find_next() 方法返回第一个符合条件的节点。

九、 find_all_previous() 和 find_previous()
这2个方法通过 previous_elements 属性对当前节点前面的tag和字符串进行迭代查找符合条件的节点。

  1. 调用语法:
    find_all_previous( name , attrs , recursive , string , **kwargs )
    find_previous( name , attrs , recursive , string , **kwargs )
  2. 语法释义:
    这2个方法的参数与find_all中同名参数用途是一样的。find_all_previous () 方法返回所有符合条件的节点, find_previous 方法返回第一个符合条件的节点。

本节介绍了BeautifulSoup查找类的主要方法,通过这些方法可以找到符合条件的html元素。本节文档老猿在BeautifulSoup官网的基础之上验证测试之后整理而成,文档结构大部分内容与官网内容,但有老猿验证之后的一些比较独特的内容。

老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython

老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/98245036
请大家多多支持,点赞、评论和加关注!谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第14.11节 Python中使用BeautifulSoup解析http报文:使用查找方法快速定位内容 的相关文章

  • Python 中的字节数组

    如何在 Python 中表示字节数组 如 Java 中的 byte 我需要用 gevent 通过网络发送它 byte key 0x13 0x00 0x00 0x00 0x08 0x00 在Python 3中 我们使用bytes对象 也称为s
  • 如何使用 pyinstaller 包含文件?

    我也使用 tkinter 使用 python 3 7 编写了一个程序 由于我使用的是外部图片 因此当我将所有内容编译为一个 exe 时 我需要包含它们 我试过做 add data bg png files 但我仍然收到此错误 tkinter
  • 从Python中的字符串中提取货币金额

    我正在制作一个程序 从字符串中获取货币并将其转换为其他货币 例如 如果字符串是 the car cost me 13 250 我需要得到 and 13250 我已经有了这个正则表达式 1 确实如此 但是该字符串很有可能有多个价格 并且全部使
  • Jupyter Notebooks 不显示进度条

    我正在尝试在 Jupyter 笔记本中显示进度条 这是一台新电脑 我通常做的事情似乎不起作用 from tqdm import tqdm notebook example iter 1 2 3 4 5 for rec in tqdm not
  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • 为什么我的代码不能根据字典解码加密字符串?

    我有一本字典 其中包含代表字母的键和值 例如一个简单的 DICT CODE b g n a p o x d t y 我收到了一个加密代码 并将该字符串转换为一个列表 其中每个项目都是一个单词 我需要根据字典中的项目来解决它 代码示例是 wo
  • 查找模块中显式定义的函数 (python)

    好的 我知道您可以使用 dir 方法列出模块中的所有内容 但是有什么方法可以仅查看该模块中定义的函数吗 例如 假设我的模块如下所示 from datetime import date datetime def test return Thi
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 登录网站并使用 python 请求下载文件

    我有一个带有 HTML 表单的网站 登录后 它会将我带到 start php 站点 然后将我重定向到overview php 我想从该服务器下载文件 当我单击 ZIP 文件的下载链接时 链接后面的地址是 getimage php path
  • 如何在 Python 3 中循环遍历集合,同时从集合中删除项目

    这是我的情况 我有一个list set 哪个并不重要 movieplayer我想调用的对象 preload 功能开启 该预加载函数可以立即返回 但希望将来返回一点 我想存储这个电影播放器 集合 表明它们尚未预加载 然后循环它们 调用prel
  • 更改 python tkinter canvas 中的线坐标

    我画了一条线tkinter Canvas现在我想移动一端 这可能吗 例如和itemconfig import tkinter tk tkinter Tk canvas tkinter Canvas tk canvas pack line c
  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • python 中的 Johansen 协整检验

    我找不到任何有关在处理统计和时间序列分析 pandas 和 statsmodel 的 Python 模块中执行 Johansen 协整检验的功能的参考 有谁知道是否有一些代码可以执行时间序列之间的协整测试 现在 这已在 Python 的 s
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • 由于 json 字符串化 dict 键导致数据丢失

    考虑下面的例子 gt gt gt import json gt gt gt d 0 potato 0 spud gt gt gt json dumps d 0 potato 0 spud gt gt gt json loads json d
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta

随机推荐

  • RestTemplate 的用法

    1 引入对应依赖 2 private final RestTemplate restTemplate 3 上代码 Service Slf4j public class CspWarehouseServiceImpl implements I
  • 小红书app复制链接转换为可直接访问链接

    当你在小红书复制某篇笔记链接 黏贴出来是这个样子的 这种链接只有打开小红书app才能够访问 那么怎么把这种链接转换为可直接访问的格式呢 执行下方代码即可 import requests import json def shortToLong
  • 代码随想录算法训练营19期第56天

    583 两个字符串的删除操作 代码随想录 初步思路 动态规划 总结 1 第一步先求出两个字符串的最长公共子序列长度 2 删除的最少步数 两个字符串的总长度减去两个最长公共子序列的长度 用时 45分钟 72 编辑距离 代码随想录 初步思路 动
  • 【LeetCode】二叉树题总结(持续更新)

    文章目录 理论 144 二叉树的前序遍历 递归与迭代 94 二叉树的中序遍历 递归与迭代 145 二叉树的后序遍历 递归与迭代 102 二叉树的层序遍历 226 翻转二叉树 101 对称二叉树 222 完全二叉树的节点个数 利用完全二叉树性
  • 前端CSS高频面试题附答案(2023)

    什么是CSS Box模型 它有哪些组成部分 CSS Box模型是指用于计算网页布局中元素大小 位置和边距的一种模型 它由四个组成部分组成 内容区域 即元素的实际内容 内边距 元素周围的空白区域 边框和外边距 什么是BFC 块级格式化上下文
  • Flask使用MySQL指南

    一 首先进入开场白 场景 几个概念和基础知识 1 SQLAlchemy alchemy 单词译为 炼金术 魔力 即表示 SQLAlchemy是个有魔力的东西 官网 http www sqlalchemy org 百度搜索SQLAlchemy
  • 《这就是区块链》之区块链基础(4)--去中心化概念

    如上图所示 在之前的3篇文章中 我们讲了区块链的加密系统以及区块链的链表结构 对区块链的 物理结构 有了初步的认识 但是 聪明的你肯定会想到 哈希算法和数字签名是互联网初期的产物 根本不是区块链特有的东西 对 如果区块链仅仅是哈希指针的话
  • metasploit简单使用-生成木马反弹shell连接

    metasploit简单使用 在Kali中运行msfconsole 运行下列命令生成test exe木马 use evasion windows windows defender exe set filename test exe set
  • python pip install error: Microsoft Visual C++ 14.0 is required

    现象 Python 安装某些包的时候 由于需要C 进行编译 可能会出现 Microsoft Visual C 14 0 is required 比如 pip install marisa trie 解决办法 1 下载编译好的 whl 文件
  • 继电器控制电路原理解析说明

    继电器驱动电流一般需要20 40mA或更大才能使继电器吸合 继电器的线圈电阻100 200欧姆 因此必须进行扩流 即驱动 图1 21所示为用NPN型三极管驱动继电器的电路图 图中阴影部分为继电器电路 继电器线圈作为集电极负载而接到集电极和正
  • 【软件测试】(四)测试用例怎么写

    文章目录 测试用例基本要素 1 评价好的测试用例的标准 2 根据需求写测试用例 3 测试用例的设计方法 3 1 基于需求进行测试用例的设计 3 2 具体的设计用例的方法 3 2 1 等价类 3 2 2 边界值 3 2 3 错误猜测法 3 2
  • php不可见字符,php怎么处理不可见字符

    php处理不可见字符的方法 首先创建一个PHP文件 然后定义一个filterNonPrintableChar方法 接着在方法体内通过while语句实现过滤不可见字符的功能逻辑 最后运行该文件即可 php过滤不可见字符 编码知识 ASCII码
  • waitpid的作用

    waitpid的使用 waitpid用于等待特定的进程结束之后 主进程再继续执行 这时主进程会进入阻塞状态 在fork之后 如果子进程不使用waitpid 则可能时主进程先结束 也可能时子进程先结束 子进程 include
  • Spring核心概念

    BeanDefinition BeanDefinition表示Bean定义 BeanDefinition中存在很多属性用来描述一个Bean的特点 比如 class 表示Bean类型 scope 表示Bean作用域 单例或原型等 lazyIn
  • python3 leecode之快乐数

    题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果 可以变为 1 那么这个数就是快乐
  • 05-Mysql夺命三连问:什么是索引下推?什么是索引覆盖?什么是回表?【Java面试总结】

    Mysql夺命三连问 什么是索引下推 什么是索引覆盖 什么是回表 索引下推是mysql5 6 提出的一个查询优化方案 主要的目的是减少数据或查询中不必要的读取和计算 它的原理是将查询条件尽可能的推送到索引层面进行过滤 减少从磁盘读取的数据量
  • Win10报错! 由于找不到hhctrl.ocx win10运行帮助时hhctrl.ocx缺失的解决方法

    hhctrl ocx下载地址 1 到网上下载hhctrl ocx 然后将下载的ocx文件复制到C Windows System32目录下 Win7 Vista系统的路径是一样的 64位放到C Windows SysWOW64 2 开始 菜单
  • 使用OpenCV对物体搜索检测与识别

    在本教程中 我们将了解对象检测中称为 选择性搜索 的重要概念 我们还将用C 和Python共享OpenCV代码 物体检测与物体识别 对象识别算法识别图像中存在哪些对象 它将整个图像作为输入 并输出该图像中存在的对象的类标签和类概率 例如 类
  • vue3 - setup之defineEmits

    基础形式 子组件 const emits defineEmits name 触发emits事件 const eventButton gt emits name 父组件
  • 第14.11节 Python中使用BeautifulSoup解析http报文:使用查找方法快速定位内容

    一 引言 在 第14 10节 Python中使用BeautifulSoup解析http报文 html标签相关属性的访问 介绍了BeautifulSoup对象的主要属性 通过这些属性可以访问标签 内容 但这种方法要么就只能访问符合条件的第一个