2-Python爬蟲-正則表示式/XML/XPath/CSS
阿新 • • 發佈:2018-11-28
頁面解析和資料提取
- 結構資料: 先有的結構,在談資料
- JSON檔案
- JSON Path
- 轉換成Python型別進行操作(json類)
- XML檔案
- 轉換成python型別(xmltodict)
- XPath
- CSS選擇器
- 正則
- JSON檔案
- 非結構化資料:先有資料,再談結構
- 文字
- 電話號碼
- 郵箱地址
- 通常處理此類資料,使用正則表示式
- 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
- name:按照那個字串搜尋,可以傳入的內容為
- find_all(name, attrs, recursive, text, ** kwargs)
- 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