1. 程式人生 > >正則,bs4 ,xpath 和jsonpath 的匹配規則

正則,bs4 ,xpath 和jsonpath 的匹配規則

三方庫 font -s 貪婪模式 通配 parse 使用方式 rom .net

正則匹配:   

規則
  單字符:
    . : 除換行以外所有字符
    [] :[aoe] [a-w] 匹配集合中任意一個字符
    \d :數字 [0-9]
    \D : 非數字
    \w :數字、字母、下劃線、中文
    \W : 非\w
    \s :所有的空白字符
    \S : 非空白
  數量修飾:
    * : 任意多次 >=0
    + : 至少1次 >=1
    ? : 可有可無 0次或者1次
    {m} :固定m次
    {m,} :至少m次
    {m,n} :m-n次
  邊界:
    \b \B
    $ : 以某某結尾
    ^ : 以某某開頭
  分組:
    (ab){3}
    (){4} 視為一個整體
    () 子模式\組模式 \1 \2
  貪婪模式:
    .*? .+?
    re.I : 忽略大小寫
    re.M :多行匹配
    re.S :單行匹配

match\search\findall
re.sub(正則表達式, 替換內容, 原字符串)

bs4匹配規則


需要安裝:pip install bs4
bs4在使用時候需要一個第三方庫,把這個庫也安裝一下 pip install lxml

簡單使用:
  說明:選擇器,jquery
    from bs4 import BeautifulSoup
  使用方式:可以將一個html文檔,轉化為指定的對象,然後通過對象的方法或者屬性去查找指定的內容
    (1)轉化本地文件:
      soup = BeautifulSoup(open(‘本地文件‘), ‘lxml‘)
    (2)轉化網絡文件:
      soup = BeautifulSoup(‘字符串類型或者字節類型‘, ‘lxml‘)
 (1)根據標簽名查找
    soup.a 只能找到第一個符合要求的標簽
 (2)獲取屬性
    soup.a.attrs 獲取所有的屬性和值,返回一個字典
    soup.a.attrs[‘href‘] 獲取href屬性
    soup.a[‘href‘] 也可簡寫為這種形式
(3)獲取內容
    soup.a.string
    soup.a.text
    soup.a.get_text()
   註意:如果標簽還有標簽,那麽string獲取到的結果為None,而其它兩個,可以獲取文本內容
 (4)find
    soup.find(‘a‘) 找到第一個符號要求的a
    soup.find(‘a‘, title="xxx")
    soup.find(‘a‘, alt="xxx")
    soup.find(‘a‘, class_="xxx")
    soup.find(‘a‘, id="xxx")

  註意:find方法不僅soup可以調用,普通的div對象也能調用,會去指定的div裏面去查找符合要求的節點
     find找到的都是第一個符合要求的標簽
 (5)find_all
    soup.find_all(‘a‘)
    soup.find_all([‘a‘, ‘b‘])
    soup.find_all(‘a‘, limit=2) 限制前兩個
 (6)select
    根據選擇器選擇指定的內容
    常見的選擇器:標簽選擇器、類選擇器、id選擇器、組合選擇器、層級選擇器、偽類選擇器、屬性選擇器
      a #標簽選擇器
      .dudu 類選擇器
      #lala id選擇器
      a, .dudu, #lala, .meme #組合選擇器
      div .dudu #lala .meme .xixi #包含選擇器
      div > p > a > .lala 只能是下面一級 #層級選擇器
      input[name=‘lala‘] #屬性選擇器

     select選擇器返回永遠是列表,需要通過下標提取指定的對象,然後獲取屬性和節點
     該方法也可以通過普通對象調用,找到都是這個對象下面符合要求的所有節點

Xpath匹配原則

安裝xpath插件
將xpath插件拖動到谷歌瀏覽器擴展程序中,安裝成功
啟動和關閉插件
  ctrl + shift + x
屬性定位
    //input[@id="kw"]
    //input[@class="bg s_btn"]
層級定位
索引定位
    //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() 獲取節點裏面不帶標簽的所有內容

直接將所有的內容拼接起來返回給你
    ret = tree.xpath(‘//div[@class="song"]‘)
    string = ret[0].xpath(‘string(.)‘)
    print(string.replace(‘\n‘, ‘‘).replace(‘\t‘, ‘‘))
取屬性
    //div[@id="u1"]/a[5]/@href

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

  ret = tree.xpath(路徑表達式)
  【註】ret是一個列表

jsonpath匹配規則

jsonpath: 用來解析json數據使用的
Python處理json格式用到的函數
  import json
  json.dumps() : 將字典或者列表轉化為json格式的字符串
  json.loads() :將json格式字符串轉化為python對象
  json.dump() : 將字典或者列表轉化為json格式字符串並且寫入到文件中
  json.load() :從文件中讀取json格式字符串,轉化為python對象
前端處理:
  將json格式字符串轉化為js對象
  JSON.parse(‘json格式字符串‘)
  eval(‘(‘ + json格式字符串 + ‘)‘)
安裝:
  pip install lxml
  pip install jsonpath
  http://blog.csdn.net/luxideyao/article/details/77802389
  xpath和jsonpath的對比
   / $ 根元素
    . @ 當前元素
    / . 子元素
// .. 任意位置查找
* * 通配符
[] ?() 過濾
  xpath 索引下標從1開始
  jsonpath 索引下標從0開始

正則,bs4 ,xpath 和jsonpath 的匹配規則