15天學會爬蟲 第四天

爬蟲

第四天

正則表達式

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

  • / 表示根路徑或者節點之間的過度
  • // 從任意位置開始查找所有的指定標籤
    1. //a 查找文檔中所有的a標籤
    2. /li//a 找根節點下面的li標籤下面的所有a標籤, ali後代節點
    3. //li/a 查找所有的li下的a標籤,ali子節點
  • @attr獲取標籤的指定屬性值
    1. //a/@href 獲取所有a標籤的href
    2. /li//img/@src獲取根節點下面的li標籤下面的img標籤的src屬性值
    3. /html/head/link/@href
  • text()獲取標籤的文本內容
    1. //a/text()獲取所有a標籤的文本值
    2. //li//text()獲取所有li標籤下所有的文本內容
  • xpath定位
    1. //a[@class='bt']所有a標籤中class屬性值爲bt的
    2. //a[text()='下一頁']/@herf 找文本爲下一頁的a標籤的href屬性值
    3. //a[1] 第一個
    4. //a[last()]最後一個
    5. //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)

數據提取的通用方式:先分組,再提取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章