1. 程式人生 > >python學習第八十五天:網絡爬蟲之數據解析方式

python學習第八十五天:網絡爬蟲之數據解析方式

數據解析 模式 end 解析 多次 pre 綜合練習 直接 list

Python網絡爬蟲之數據解析方式

正則解析

單字符:
        . : 除換行以外所有字符
        [] :[aoe] [a-w] 匹配集合中任意一個字符
        \d :數字  [0-9]
        \D : 非數字
        \w :數字、字母、下劃線、中文
        \W : \w
        \s :所有的空白字符包,括空格、制表符、換頁符等等。等價於 [ \f\n\r\t\v]\S : 非空白
    數量修飾:
        * : 任意多次  >=0
        + : 至少1次   >=1
        ? : 可有可無  0次或者1次
        {m} :固定m次 hello{3,}
        {m,} :至少m次
        {m,n} :m-n邊界:
        $ : 以某某結尾 
        ^ : 以某某開頭
    分組:
        (ab)  
    貪婪模式 .*
    非貪婪(惰性)模式 .*?

    re.I : 忽略大小寫
    re.M :多行匹配
    re.S :單行匹配

    re.sub(正則表達式, 替換內容, 字符串)

xpath解析

from lxml import etree
    兩種方式使用:將html文檔變成一個對象,然後調用對象的方法去查找指定的節點
    1)本地文件
        tree = etree.parse(文件名)
    2)網絡文件
        tree = etree.HTML(網頁字符串)

    ret = tree.xpath(路徑表達式)
    【註】ret是一個列表
  參考文獻:http://www.w3school.com.cn/xpath/xpath_intro.asp

  - 安裝xpath插件:可以在插件中直接執行xpath表達式

    1.將xpath插件拖動到谷歌瀏覽器拓展程序(更多工具)中,安裝成功

    2.啟動和關閉插件 ctrl + shift + x
- 常用表達式:
  /bookstore/book           選取根節點bookstore下面所有直接子節點book
    //book                    選取所有book
    /bookstore//book          查找bookstore下面所有的book
    /bookstore/book[1]        bookstore裏面的第一個book
    /bookstore/book[last()]   bookstore裏面的最後一個book
    /bookstore/book[position()<3]  前兩個book
    //title[@lang]            所有的帶有lang屬性的title節點
    //title[@lang=‘eng‘]      所有的lang屬性值為eng的title節點
    屬性定位
            //li[@id="hua"]
            //div[@class="song"]
    層級定位&索引
            //div[@id="head"]/div/div[2]/a[@class="toindex"]
            【註】索引從1開始
            //div[@id="head"]//a[@class="toindex"]
            【註】雙斜杠代表下面所有的a節點,不管位置
     邏輯運算
            //input[@class="s_ipt" and @name="wd"]
     模糊匹配 :
          contains
                //input[contains(@class, "s_i")]
                所有的input,有class屬性,並且屬性中帶有s_i的節點
                //input[contains(text(), "愛")]
            starts-with
                //input[starts-with(@class, "s")]
                所有的input,有class屬性,並且屬性以s開頭
      取文本
            //div[@id="u1"]/a[5]/text()  獲取節點內容
            //div[@id="u1"]//text()      獲取節點裏面不帶標簽的所有內容
      取屬性
            //div[@id="u1"]/a[5]/@href    

- 代碼中使用xpath    1.導包:from lxml import etree

    2.將html文檔或者xml文檔轉換成一個etree對象,然後調用對象中的方法查找指定的節點

      2.1 本地文件:tree = etree.parse(文件名)

      2.2 網絡數據:tree = etree.HTML(網頁內容字符串)

  - 綜合練習:

    需求:獲取好段子中段子的內容和作者   http://www.haoduanzi.com
from lxml import etree
import requests

url=‘http://www.haoduanzi.com/category-10_2.html‘
headers = {
        ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36‘,
    }
url_content=requests.get(url,headers=headers).text
#使用xpath對url_conten進行解析
#使用xpath解析從網絡上獲取的數據
tree=etree.HTML(url_content)
#解析獲取當頁所有段子的標題
title_list=tree.xpath(‘//div[@class="log cate10 auth1"]/h3/a/text()‘)

ele_div_list=tree.xpath(‘//div[@class="log cate10 auth1"]‘)

text_list=[] #最終會存儲12個段子的文本內容
for ele in ele_div_list:
    #段子的文本內容(是存放在list列表中)
    text_list=ele.xpath(‘./div[@class="cont"]//text()‘)
    #list列表中的文本內容全部提取到一個字符串中
    text_str=str(text_list)
    #字符串形式的文本內容防止到all_text列表中
    text_list.append(text_str)
print(title_list)
print(text_list)

python學習第八十五天:網絡爬蟲之數據解析方式