2-2.数据解析篇
python 里面得標準庫 正則
match 的使用
import recontent = 'Hello 123 456 welcome to tuling' result = re.match('^Hello\s\d\d\d\s\d{3}\s\w{7}', content)# print(result.span()) # (0, 21)# print(result.group()) # Hello 123 456 welcome# 匹配1次到多次 \d+ content1 = 'Hello 123456 welcome to tuling' result1 = re.match('^Hello\s(\d+)\swelcome', content1)# print(result1.group(1)) # 123456# 通用匹配 content2 = 'Hello 123 456 welcome to tuling' # 匹配所有數據 ^ 以什么什么開頭 $ 以什么什么結尾 result2 = re.match('^Hello.*ng$', content2) # print(result2.group(0)) # Hello 123 456 welcome to tuling# 分組匹配只有用(.*)小括號才可以用group(1) result3 = re.match('^Hello(.*)ng$', content2).group(1) # print(result3) # 123 456 welcome to tuli# 貪婪模式講解 content4 = 'http://feier.com/yyds/asdasdas' # 非貪婪模式 .*? 匹配到第一個就結束 result4 = re.match('http.*?com/(.*?)s', content4) # print(result4.group()) # http://feier.com/yyds# 貪婪模式 .* 匹配到最后一個 result5 = re.match('http.*?com/(.*)s', content4) # print(result5.group()) # http://feier.com/yyds/asdasdas# 修飾符 # 這個修飾符的作用是匹配包括換行符在內的所有字符。 content5 = '''Hello 1234567 World_This is a Regex Demo ''' result6 = re.match('^He.*?(\d+).*?Demo$', content5) # print(result6) # None 返回空 就是沒有匹配成功# re.S 能夠匹配所有字符串,包括換行 result7 = re.match('^He.*?(\d+).*?Demo$', content5,re.S) # print(result7.group()) ''' Hello 1234567 World_This is a Regex Demo ''' # print(result7.group(1)) # 1234567findall 返回得是列表 查詢全部得意思
html = '''<div id="songs-list"> <h2 class="title">經典老歌</h2> <p class="introduction"> 經典老歌列表 </p> <ul id="list" class="list-group"> <li data-view="2">一路上有你</li> <li data-view="7"> <a href="/2.mp3" singer="任賢齊">滄海一聲笑</a> </li> <li data-view="4" class="active"> <a href="/3.mp3" singer="齊秦">往事隨風</a> </li> <li data-view="6"><a href="/4.mp3" singer="beyond">光輝歲月</a></li> <li data-view="5"><a href="/5.mp3" singer="陳慧琳">記事本</a></li> <li data-view="5"> <a href="/6.mp3" singer="鄧麗君">但愿人長久</a> </li> </ul> </div>'''results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S) print(results)PyQuery的使用
from pyquery import PyQuery as pq import requestshtml = ''' <div id="cont"><ul class="slist"><li class="item-0">web開發</li><li class="item-1"><a href="link2.html">爬蟲開發</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">數據分析</span></a></li><li class="item-1 active"><a href="link4.html">深度學習</a></li><li class="item-0"><a href="link5.html">機器學習</a></li></ul></div> '''obj = pq(html)# 固定語法 空格能夠讓底層開發技術 根據規律來進行后續得工作 # id 選擇器 . 是class選擇器 為了編寫css 語法的 li = obj('#cont .slist li')# 爬蟲課 需要的基本知識 前端技術的一個了解 html css JavaScript for i in li.items():# print(i)# 提取內容# print(i.text())passit = obj('ul') # 通過查找方式 # print(it.find('li')) # 子節點 子 方法 查找全部兒子 # print(it.children()) # 找上級 一起返回 # print(it.parent())li = obj('.slist .item-0.active a') # print(li.siblings()) # print(li.siblings('.active'))# 提取屬性 doc = pq(html) li2 = doc('.item-0.active') # print(li2) li2.removeClass('active') # print(li2) li2.addClass('feifei') # print(li2)抓取圖片名稱和地址
from pyquery import PyQuery as pq import requestsres = requests.get('https://pic.netbian.com/4kmeinv/index.html') res.encoding = 'gbk' document = pq(res.text) img_list = document('.slist ul li img')item_list = [] for i in img_list:item_list.append(dict(i.items()))imags_url = [] image_name = []for it in item_list:imags_url.append('https://pic.netbian.com' + it['src'])image_name.append(it['alt'])images = zip(imags_url,image_name)print(list(images))XPath使用
XPath常用規則
nodename 選取此節點的所有子節點
/ 從當前節點選取直接子節點
// 從當前節點選取子孫節點
. 選取當前節點,類似于this
… 選取當前節點的父節點
@ 選取屬性
案例
from lxml import etreetext = ''' <div><ul><li class="item-0"><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> '''html = etree.HTML(text)a = html.xpath('//ul/li/a') for i in a:# 提取屬性 返回的格式是列表形式print(i.xpath('./@href'))# 提取文本print(i.xpath('./text()'))# 講講contains 模糊查詢 # //a[contains(text(),'下一頁')]/@href#去除結果中的/r/n normalize-space() 案例: ite.xpath('normalize-space(./div/div[@class="resblock-price"]/div/span[@class="number"]/text())')總結
- 上一篇: PHP实现极光推送
- 下一篇: 飞信怎么登陆总是显示服务器错误咋回事,手