1. 程式人生 > >2-Python爬蟲-正則表示式/XML/XPath/CSS

2-Python爬蟲-正則表示式/XML/XPath/CSS

頁面解析和資料提取

  • 結構資料: 先有的結構,在談資料
    • JSON檔案
      • JSON Path
      • 轉換成Python型別進行操作(json類)
    • XML檔案
      • 轉換成python型別(xmltodict)
      • XPath
      • CSS選擇器
      • 正則
  • 非結構化資料:先有資料,再談結構
    • 文字
    • 電話號碼
    • 郵箱地址
      • 通常處理此類資料,使用正則表示式
    • Html檔案
      • 正則
      • XPath
      • CSS選擇器

正則表示式

  • 一套規則,可以在字串文字中進行搜查替換等
  • 案例v23,re的基本使用流程
  • 案例v24,match的基本使用
  • 正則常用方法:
    • match: 從開始位置開始查詢,一次匹配
    • search:從任何位置查詢,一次匹配, 案例v25
    • findall: 全部匹配,返回列表, 案例v26
    • finditer: 全部匹配,返回迭代器, 案例v26
    • split: 分割字串,返回列表
    • sub:替換
  • 匹配中文
    • 中文unicode範圍主要在[u4e00-u9fa5]
    • 案例v27
  • 貪婪與非貪婪模式
    • 貪婪模式: 在整個表示式匹配成功的前提下,儘可能多的匹配
    • 非貪婪模式: xxxxxxxxxxxxxxxxxxxxxx, 儘可能少的匹配
    • python裡面數量詞預設是貪婪模式
    • 例如:
      • 查詢文字abbbbbbccc
      • re是 ab*
      • 貪婪模式: 結果是abbbbbb
      • 非貪婪: 結果是a

        XML

  • XML(EXtensibleMarkupLanguage)
  • http://www.w3school.com.cn/xml/index.asp
  • 案例v28.xml
  • 概念:父節點,子節點,先輩節點,兄弟節點,後代節點

XPath

  • XPath(XML Path Language), 是一門在XML文件中查詢資訊的語言,
  • 官方文件: http://www.w3school.com.cn/xpath/index.asp
  • XPath開發工具
    • 開元的XPath表示式工具: XMLQuire
    • chrome外掛: Xpath Helper
    • Firefox外掛: XPath CHecker
  • 常用路徑表示式:
    • nodename: 選取此節點的所有子節點
    • /: 從根節點開始選
    • //: 選取元素,而不考慮元素的具體為止
    • .: 當前節點
    • ..:父節點
    • @: 選取屬性
    • 案例:
      • booksotre: 選取bookstore下的所有子節點
      • /booksotre: 選取根元素
      • booksotre/book: 選取bookstore的所有為book的子元素
      • //book: 選取book子元素
      • //@lang:選取名稱為lang的所有屬性
  • 謂語(Predicates)
    • 謂語用來查詢某個特定的節點,被向前在方括號中
    • /bookstore/book[1]: 選取第一個屬於bookstore下叫book的元素
    • /bookstore/book[last()]: 選取最後一個屬於bookstore下叫book的元素
    • /bookstore/book[last()-1]: 選取倒數第二個屬於bookstore下叫book的元素
    • /bookstore/book[position()<3]: 選取屬於bookstore下叫book的前兩個元素
    • /bookstore/book[@lang]: 選取屬於bookstore下叫book的,含有屬性lang元素
    • /bookstore/book[@lang="cn"]: 選取屬於bookstore下叫book的,含有屬性lang的值是cn的元素
    • /bookstore/book[@price < 90]: 選取屬於bookstore下叫book的,含有屬性price的,且值小於90的元素
    • /bookstore/book[@price < 90]/title: 選取屬於bookstore下叫book的,含有屬性price的,且值小於90的元素的子元素title
  • 萬用字元
    • * : 任何元素節點
    • @*: 匹配任何屬性節點
    • node(): 陪陪任何型別的節點
  • 選取多個路徑
    • //book/tile | //book/author : 選取book元素中的title和author元素
    • //tile | //price: 選取文件中所有的title和price元素

lxml庫

  • python的HTML/XML的解析器
  • 官方文件: http://lxml.de/index.html
  • 功能:
    • 解析HTML,案例v29.py
    • 檔案讀取,案例v30.html, v31.py
    • etree和XPath的配合使用, 案例v32.py

CSS選擇器 BeautifulSoup4

  • 現在使用BeautifulSoup4
  • http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
  • 幾個常用提取資訊工具的比較:
    • 正則: 很快,不好用,不許安裝
    • beautifulsoup:慢,使用簡單,安裝簡單
    • lxml: 比較快,使用簡單,安裝一般
  • 案例v33.py
  • 四大物件
    • Tag
    • NavigableString
    • BeautifulSoup
    • Comment
  • Tag
    • 對應Html中的標籤
    • 可以通過soup.tag_name
    • tag兩個重要屬性
      • name
      • attrs
    • 案例a34
  • NavigableString
    • 對應內容值
  • BeautifulSoup
    • 表示的是一個文件的內容,大部分可以把他當做tag物件
    • 一般我們可以用soup來表示
  • Comment
    • 特殊型別的NavagableString物件,
    • 對其輸出,則內容不包括註釋符號
  • 遍歷文件物件
    • contents: tag的子節點以列表的方式給出
    • children: 子節點以迭代器形式返回
    • descendants: 所子孫節點
    • string
    • 案例34
  • 搜尋文件物件
    • find_all(name, attrs, recursive, text, ** kwargs)
      • name:按照那個字串搜尋,可以傳入的內容為
        • 字串
        • 正則表示式
        • 列表
      • kewwortd引數,可以用來表示屬性
      • text: 對應tag的文字值
      • 案例34
  • css選擇器
    • 使用soup.select, 返回一個列表
    • 通過標籤名稱: soup.select("title")
    • 通過類名: soup.select(".content")
    • id查詢: soup.select("#name_id")
    • 組合查詢: soup.select("div #input_content")
    • 屬性查詢: soup.select("img[class='photo'])
    • 獲取tag內容: tag.get_text
    • 案例35