網站首頁 編程語言 正文
前言
在使用爬蟲提取網頁中的部分信息時,采用到了re.compile()與re.findall()兩種方法,目的:把網頁中的“某某城市土地規劃表”截取并打印出來.
網頁中的代碼:
<span class='tab-details'>某某城市土地規劃表</span>
提取的方法:
def parse_response(html):
pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S)
items = re.findall(pattern,html)
print(items)
return items
結果:
['某某城市土地規劃表']
這里主要講解pattern,re.compile()與re.findall()的定義及用法:
1.pattern :pattern 屬性規定用于驗證輸入字段的正則表達式。
2.re.compile():compile() 方法用于在腳本執行過程中編譯正則表達式,也可用于改變和重新編譯正則表達式。
舉例:在字符串中全局搜索 "man",并用 "person" 替換。然后通過 compile() 方法,改變正則表達式,用 "person" 替換 "man" 或 "woman",:
<script type="text/javascript">
var str="Every man in the world! Every woman on earth!";
patt=/man/g;
str2=str.replace(patt,"person");
//用person取代man
document.write(str2+"<br />");
patt=/(wo)?man/g;
patt.compile(patt);
str2=str.replace(patt,"person");
//用person取代man或者woman
document.write(str2);
</script>
輸出:(可見第一行中的man都被person取代,出現了woperson,第二行的的man和woman也被person取代,只有person,沒有其他奇奇怪怪的字符串)
Every person in the world! Every woperson on earth!
Every person in the world! Every person on earth!
3.re.findall():額,這個最難搞,主要是為了講解(.*?)
re.findall()函數是返回某種形式(比如String)中所有與pattern匹配的全部字符串,返回形式為數組。
下面是findall()函數的兩種表示形式:(上面的代碼采取的便是第二種形式):
import re
kk = re.compile(r'\d+')
kk.findall('one1two2three3four4')
#[1,2,3,4]
#注意此處findall()的用法,可傳兩個參數;
kk = re.compile(r'\d+')
re.findall(kk,"one123")
#[1,2,3]
下面的是常用的正則表達式:
import re
str = 'aabbabaabbaa'
# 一個"."就是匹配除 \n (換行符)以外的任意一個字符
print(re.findall(r'a.b',str))#['aab', 'aab']
# *前面的字符出現0次或以上
print(re.findall(r'a*b',str))#['aab', 'b', 'ab', 'aab', 'b']
# 貪婪,匹配從.*前面為開始到后面為結束的所有內容
print(re.findall(r'a.*b',str))#['aabbabaabb']
# 非貪婪,遇到開始和結束就進行截取,因此截取多次符合的結果,中間沒有字符也會被截取
print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab']
# 非貪婪,與上面一樣,只是與上面的相比多了一個括號,只保留括號的內容
print(re.findall(r'a(.*?)b',str))#['a', '', 'a']
str = '''aabbab
aabbaa
bb''' #后面多加了2個b
# 沒有把最后一個換行的aab算進來
print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab']
# re.S不會對\n進行中斷
print(re.findall(r'a.*?b',str,re.S))#['aab', 'ab', 'aab', 'aa\n b']
注意'.*?'是對它的前后部分作為開始結束部分進行截取,而'(.*?)'也是把其前后作為開始結束,但是只截取括號部分,不包含開始結束部分!?。。ㄍ瑫r在對前后部分的選擇時要注意特征明確點,就是與眾不同的的嘛,防止截取出的是其他部分?。?/p>
re.findall中參數re.S的意義:
1.字符串變為(后面多加了2個b)
str = '''aabbab
aabbaa
bb'''
2.參數無re.S,沒有把最后一個換行的aab算進來
print(re.findall(r'a.*?b',str))
#['aab', 'ab', 'aab']
3.參數有re.S,不會對\n進行中斷
print(re.findall(r'a.*?b',str,re.S))
#['aab', 'ab', 'aab', 'aa\n b']
在我們一開始的代碼中就有re.s,因為在爬取網頁的內容時是按照一個一個塊的來爬取,可以理解為并列部分,會存在/n分行符。
def parse_response(html):
pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S)
items = re.findall(pattern,html)
print(items)
return items
參考:
1.HTML input pattern 屬性?
2.Pattern用法(正則表達式)
3.JavaScript compile() 方法
4.Python 正則表達re模塊之findall()詳解
總結
原文鏈接:https://blog.csdn.net/yur_ke/article/details/123931594
相關推薦
- 2022-11-07 python中dot函數運算過程總結_python
- 2022-09-16 Python中的?No?Module?named?***問題及解決_python
- 2022-04-03 用Python實現控制電腦鼠標_python
- 2022-10-17 Python?pywin32實現word與Excel的處理_python
- 2023-02-09 React?Context原理深入理解源碼示例分析_React
- 2022-09-01 C#通過System.CommandLine快速生成支持命令行的應用程序_C#教程
- 2022-05-19 golang?中?channel?的詳細使用、使用注意事項及死鎖問題解析_Golang
- 2023-01-08 Android?IntentFilter的匹配規則示例詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支