此findall()非彼findAll()

本文介绍了如何使用BeautifulSoup的findAll()函数和正则表达式的findall()函数进行网页内容抓取。通过实例展示了在<class'bs4.BeautifulSoup'>类型对象中根据标签查找内容的方法,并对比了字符串查找的差异。

在学beautifulsoup时候遇到findAll()函数。起初以为它和findall()是一样的,后来发现“腰”粗了,果然就不是同一个人了啊。他们两个最根本的区别在于:

		findAl()l在<class 'bs4.BeautifulSoup'>类型的对象里根据标签查找。				   
		而findall()在string里面查找。

findAll()

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
html=urlopen("http://www.pythonscraping.com/pages/warandpeace.html") #打开url并将内容存入变量名html里
print(type(html))
bsObj=BeautifulSoup(html)
nameList=bsObj.findAll("span",{"class","green"})#寻找标签是span,其value是‘class=green’的内容
for name in nameList:
    print(name.get_text())

bsObj=BeautifulSoup(html)这一步十分重要,有了这一步才能使用接下来的findAll。

findall()

  1. 和compile结合:
>>> import re
>>> s="adfad asdfasdf asdfas asdfawef asd adsfas"
>>> reObj1 = re.compile('((\w+)\s+\w+)')
>>> reObj1.findall(s)
[('adfad asdfasdf', 'adfad'), ('asdfas asdfawef', 'asdfas'), ('asd adsfas', 'asd')]

reObj1是pattern,而s是string。

  1. 正规用法:pattern和string都在括号内
>>> bsObj="spanno yes sp hu span"
>>> re.findall("span", bsObj)
['span', 'span']
03-14
### Python `re.findall` 使用方法 Python 中的正则表达式模块 `re` 提供了一个常强大的函数 `findall`,用于匹配字符串中的所有子串并返回它们作为列表。以下是其基本语法: #### 基本语法 ```python re.findall(pattern, string, flags=0) ``` - **pattern**: 要匹配的正则表达式模式。 - **string**: 需要被搜索的目标字符串。 - **flags** (可选): 修改正则行为的标志位。 该函数会扫描整个目标字符串,并返回所有不重叠的匹配项组成的列表[^1]。 --- #### 示例代码 以下是一些常见的使用场景及其对应的代码示例: ##### 示例 1: 查找所有的单词 如果希望找到字符串中所有的字母序列(即单词),可以这样实现: ```python import re text = "Hello world! This is a test." result = re.findall(r'\b\w+\b', text) print(result) # 输出 ['Hello', 'world', 'This', 'is', 'a', 'test'] ``` 这里 `\b` 表示单词边界,`\w+` 匹配一个或多个字母、数字或下划线字符。 --- ##### 示例 2: 查找特定长度的数字 假设需要提取一段文本中所有由三位数构成的数字: ```python import re text = "The numbers are 123 and 456789 but not 12" result = re.findall(r'\b\d{3}\b', text) print(result) # 输出 ['123'] ``` 这里的 `\d{3}` 表示恰好三个连续的数字。 --- ##### 示例 3: 处理大小写敏感性 默认情况下,`findall` 是区分大小写的。可以通过传递参数 `re.IGNORECASE` 来忽略大小写差异: ```python import re text = "Find apple, Apple, and APPLE!" result = re.findall('apple', text, re.IGNORECASE) print(result) # 输出 ['apple', 'Apple', 'APPLE'] ``` --- ##### 示例 4: 结合分组捕获括号 `( )` 当正则表达式中有捕获组时,`findall` 只会返回捕获的内容而完整的匹配结果: ```python import re text = "Name: John Doe Age: 30 Name: Jane Smith Age: 25" result = re.findall(r'Name:\s*(.*?)\s*Age:', text) print(result) # 输出 ['John Doe', 'Jane Smith'] ``` 上述例子中,`(.*?)` 定义了一组贪婪匹配来获取名字部分。 --- ### 注意事项 1. 如果没有找到任何匹配项,则返回空列表[]。 2. 对于复杂的正则需求,建议先测试正则表达式的准确性再应用于实际数据处理[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值