re+lxml+requests基礎知識

python學習–re+lxml+requests

概括:requests用來爬取網頁,而re和lxml從爬取的網頁中提取信息,lxml爲主re爲輔;re也可用來獲取帶html標籤的整段。

使用到的庫:

re lxml requests
re >python自帶的庫,使用時只需導入即可:import re
lxml>第三方庫,使用時需先安裝,使用>>pip install lxml,安裝失敗的話(一般是因爲超時),可更換包源:>>pip install lxml -i http://mirrors.aliyun.com/pypi/simple/ ,如果還不行就到https://pypi.python.org/pypi/lxml/3.4.2下載源碼(.whl),cd到源碼所在位置,pip install [packpages_name]進行安裝(安裝.whl文件需安裝wheel包)。
requests>第三方庫,使用前需先安裝,安裝方式同lxml,不過requests依賴很多包,一般有 certifi urllib3 chardet等,可根據錯誤提示進行安裝。

re

正則表達式是最靈活最強大的工具之一,熟練使用正則表達式可極大地減少工作量,缺點是效率低(?)

一條正則表達式的組成單位

  1. 原子
    ->普通字符(大小寫字母、數字、下劃線)
    ->非打印字符(\n 、\t)
    ->通用字符 (如下表,只匹配一個字符)
    ->原子表([aA_5 ]匹配方括號中的任一個字符,[^Asf _]除了括號裏的字符都能匹配)
符號 含義
\w 任意一個字母、數字或下劃線
\W 除字母、數字或下劃線以外的字符
\d 任意一個十進制數
\D 除十進制外的任意一個字符
\s 任意一個空白字符
\S 除空白字符外的任意一個字符

2. 元字符

符號 含義
. 除換行符外任意字符
^ 匹配字符串開始的位置
$ 匹配字符串結束的位置
* 匹配0次、1次或多次前面的原子
? 匹配0次或1次前面的原子
+ 匹配1次或多次前面的原子
{n} 前面的原子恰好出現n次
{n,} 前面的原子至少出現n次
{n,m} 前面的原子至少出現n次,至多出現m次
| 模式選擇符
() 模式單元符(可以把一個組合當成一個原子來處理)

3. 模式修正符

I >>> 匹配時忽略大小寫
M >>>多行匹配
L >>> 做本地化識別匹配
U >>>根據Unicode字符解析字符
S>>>使 “.”可以匹配任意字符


re裏的常見函數

result=re.match(pattern,string,flag)(從源字符串的起始位置匹配,不滿足返回None)
result=re.search(pattern,string,flag)(掃描整個字符串進行匹配,全文搜索,只返回一個結果)
pattern:正則表達式 ; string:源字符串;flag:修正符;匹配位置:result.span();返回字符串:result.group().

上面兩個函數只返回一個結果,怎樣才能把匹配的字符串都返回呢?如下
>result=re.compile(pattern).findall(string)
>返回的是匹配的字符串列表

另外一個就是result=re.sub(pattern,new_str,string,count)
結果返回替換後的字符串,count是替換的次數
這個需求用自帶的result=replace(old,new,str)函數都能滿足我們。

>特別記憶點:匹配不以某字符串開頭的string>>pattern=”^(?!abc).*”


lxml

在爬取過程中我們一般是先獲得整個網頁(一般情況),我們需要的信息就隱藏在其中,我們需要將他們提取出來,而提取的工具除了re外最好用的就是lxml了(當然還有beautifulsoup),lxml好用就好用在它的xpath上。

-基礎

使用 lxml 需要先導入:from lxml import etree,etree有兩個方法
html=etree.parse(‘http://www.baidu.com‘) 用來解析網頁,也可以是本地文件
html=etree.HTML(str) 用來格式化字符串形式的網頁文件,這兩個結果都是 etree element對象,爲後面使用xpath做基礎。

-xpath
只要是etree element對象都可以使用xpath,xpath一般返回的結果是elemrnt tree對象列表。要獲取字符串內容,
1、信息在標籤屬性中
result = html.xpath(‘//li[last()]/a/@href’)
print result >>>[‘http://www.baidu.com‘,]
2、信息在標籤中
a=html.xpath(“//ul”)
print(a) >>>[“<”Element ul at 0x21c018ee908>]
print(a[0].text)>>>aaa

xpath語法:
egg1:
//div[@class=’list’]/a >>>選取class=list的div標籤的子後代a標籤
//div[@class=’list’]//a >>>選取class=list的div標籤的後代a標籤,無論是子後代還是孫後代。

>egg2:
>`<html><body>
<div>
    <ul>
    aaa
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
 </div>

</body></html>`

from lxml import etree
html=etree.HTML(html)

a=html.xpath(“//ul”)
此時a是element 對象列表
print(a) >>>[“<”Element ul at 0x21c018ee908>]
print(len(a))>>>1
print(a[0].text)>>>aaa
說明當路徑最後是標籤名時,返回的是標籤包含的字符串,

b=html.xpath(“//ul/li”)
print(b) >>>[“<”Element li at 0x2ba19e3e908>, “<”Element li at 0x2ba19e3e8c8>, “<”Element li at 0x2ba19e3e9c8>, “<”Element li at 0x2ba19e3ea08>, “<”Element li at 0x2ba19e3ea48>]

c=html.xpath(“//ul/li[1]/@class”)
print(c) >>>[‘item-0’]
當有多個匹配的標籤時,可像列表一樣指定某一個,不同的是從1開始。


requests

requests庫(官方文檔)封裝了python其他的http相關的庫,擁有豐富、統一、簡單的API調用接口,極大地減少了代碼量,缺點是我們不能接觸到底層的實現原理,在完全掌握之後一定要把這些基礎知識補上。2017-9-26。

請求
requests接口調用具體可參照requests文件夾下的api.py文件,裏面有詳細的說明
requests支持多種http請求類型,但最常見的是get、post請求
import requests
r=requests.request(method,url,**kwargs)
說明:method指http請求類型,形如:”GET”,大寫且在引號裏
url:”http://www.baidu.com“,
**kwargs指形如:key=value,這種形式的參數,在此API中有以下幾種參數
params={}:get請求方式要傳遞的參數
data={}:post請求方式要傳遞的參數
headers={}:請求頭部
cookies={} or CookieJar object :cookie
proxies={}:形如:{“http”: “http://10.10.1.10:3128“,}或者{“http”: “http://user:[email protected]:3128/“,}
以下是不常用的
json=json data:
auth=auth tuple
timeout=float:單位是秒
allow_redirects=bool:默認是True

返回結果查詢
r.status_code:返回請求的狀態碼,
r.headers:查看響應頭
r.history:查看跳轉歷史
r.text:返回一個字符串,要改變其編碼需要先r.encoding=’utf-8’
r.content:返回byte,可將其編碼爲需要形式,r.content.decode(‘utf-8’)
r.cookies:查看響應的cookie


requests的高級應用-session和cookie

會話對象讓你能夠跨請求保持某些參數。它也會在同一個 Session 實例發出的所有請求之間保持 cookie
s=requests.Session()
jar = requests.cookies.RequestsCookieJar()
jar.set(‘tasty_cookie’, ‘yum’, domain=’httpbin.org’, path=’/cookies’)
s.get(‘url_1’,cookies=jar)#可以在請求中傳入cookie
s.get(‘url_2)

發佈了25 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章