爬蟲
第四天
正則表達式
1.1 單個字符
\d
數字0-9\s
空白字符 空格\t
\n
\w
單詞字符.
除了\n
的任意字符- [a-d0-9] 匹配a-d或者0-9中任意一個
1.2 多個字符
- {m,n}前一個字符出現m-n次(包含m和n)
*
匹配前一個字符任意次(0,1,多次)+
匹配前一個字符至少一次(1或者多次)?
匹配前一個字符0次或1次
1.3 re模塊
- re.findall() # 查找所有
- re.sub() # 替換,數據清洗的時候很常用
- re.compile() # 先編譯後匹配,提高匹配效率
re.findall(“regex”),如果正則表達式進行了分組,需要考慮返回的數據情況
- 一個分組,返回包含字符串的列表
- 多個分組,返回包含元組的列表,元組內是多個分組匹配到的字符串
r的用途
忽略轉義符號\
帶來的影響,爲了表示原字符本身的話,直接在正則表達式前面加上r
即可
Windows下的文件路徑需要加上r
xpath
/
表示根路徑或者節點之間的過度//
從任意位置開始查找所有的指定標籤//a
查找文檔中所有的a標籤/li//a
找根節點下面的li
標籤下面的所有a
標籤,a
是li
的後代節點
//li/a
查找所有的li
下的a
標籤,a
是li
的子節點
@attr
獲取標籤的指定屬性值//a/@href
獲取所有a
標籤的href
值/li//img/@src
獲取根節點下面的li
標籤下面的img
標籤的src
屬性值/html/head/link/@href
text()
獲取標籤的文本內容//a/text()
獲取所有a
標籤的文本值//li//text()
獲取所有li
標籤下所有的文本內容
- xpath定位
//a[@class='bt']
所有a標籤中class屬性值爲bt的//a[text()='下一頁']/@herf
找文本爲下一頁的a標籤的href屬性值//a[1]
第一個//a[last()]
最後一個//a[postions()<3]
前2個
4. lxml模塊的使用
pip install lxml
from lxml import etree
text = '''<html> <div> <ul>
<li class="item-1"><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>
</ul> </div> '''
# 將網頁內容加載,返回一個Element對象,具有xpath方法
el = etree.HTML(text)
# 將element對象還原爲網頁數據的字符串
print(etree.tostring(el).decode())
# xpath表達式如果是定位標籤,返回的結果是一個以element爲元素的列表
li_list = el.xpath("//li[@class='item-1']")
print(li_list)
# 建議這樣寫
li_list[0].xpath("./a/@href")
# 不建議這樣寫
li_list[0].xpath("a/@href")
# xpath表達式如果是獲取屬性值或者文本。返回的結果是一個以字符串爲元素的列表
href_list = el.xpath("//li[@class='item-1']/a/text()")
print(href_list)
數據提取的通用方式:先分組,再提取