爬蟲—lxml提取資料
阿新 • • 發佈:2021-06-13
我們好久不見~
來更新部落格啦!最近在學爬蟲,scrapy學不下去了,有點難搞啊,學點簡單的吧哈哈哈哈
好啦,開始今天的分享~
首先得安裝lxml庫,pip install lxml
我們使用lxml庫對html這樣的字串進行解析,將它還原為一個HTML頁面,換句話說,Python裡面的lxml庫只做了這樣一件事:將html字串進行解析,供Xpath語法進行資料提取。
使用lxml中的etree對html進行處理,將它還原成網頁
這裡我們也需要先了解一下Xpath的知識,也很簡單,我們通過一個具體的例子來演示一下
text = \ """ <ul class="ullist" padding="1" spacing="1"> <li> <div id="top"> <span class="position" width="350">職位名稱</span> <span>職位類別</span> <span>人數</span> <span>地點</span> <span>釋出時間</span> </div> <div id="even"> <span class="l square"> <a target="_blank" href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218">python開發工程師</a> </span> <span>技術類</span> <span>2</span> <span>上海</span> <span>2018-10-23</span> </div> <div id="odd"> <span class="l square"> <a target="_blank" href="position_detail.php?id=29938&keywords=python&tid=87&lid=2218">python後端</a> </span> <span>技術類</span> <span>2</span> <span>上海</span> <span>2018-10-23</span> </div> <div id="even"> <span class="l square"> <a target="_blank" href="position_detail.php?id=31236&keywords=python&tid=87&lid=2218">高階Python開發工程師</a> </span> <span>技術類</span> <span>2</span> <span>上海</span> <span>2018-10-23</span> </div> <div id="odd"> <span class="l square"> <a target="_blank" href="position_detail.php?id=31235&keywords=python&tid=87&lid=2218">python架構師</a> </span> <span>技術類</span> <span>1</span> <span>上海</span> <span>2018-10-23</span> </div> <div id="even"> <span class="l square"> <a target="_blank" href="position_detail.php?id=34531&keywords=python&tid=87&lid=2218">Python資料開發工程師</a> </span> <span>技術類</span> <span>1</span> <span>上海</span> <span>2018-10-23</span> </div> <div id="odd"> <span class="l square"> <a target="_blank" href="position_detail.php?id=34532&keywords=python&tid=87&lid=2218">高階影象演算法研發工程師</a> </span> <span>技術類</span> <span>1</span> <span>上海</span> <span>2018-10-23</span> </div> <div id="even"> <span class="l square"> <a target="_blank" href="position_detail.php?id=31648&keywords=python&tid=87&lid=2218">高階AI開發工程師</a> </span> <span>技術類</span> <span>4</span> <span>上海</span> <span>2018-10-23</span> </div> <div id="odd"> <span class="l square"> <a target="_blank" href="position_detail.php?id=32218&keywords=python&tid=87&lid=2218">後臺開發工程師</a> </span> <span>技術類</span> <span>1</span> <span>上海</span> <span>2018-10-23</span> </div> <div id="even"> <span class="l square"> <a target="_blank" href="position_detail.php?id=32217&keywords=python&tid=87&lid=2218">Python開發(自動化運維方向)</a> </span> <span>技術類</span> <span>1</span> <span>上海</span> <span>2018-10-23</span> </div> <div id="odd"> <span class="l square"> <a target="_blank" href="position_detail.php?id=34511&keywords=python&tid=87&lid=2218">Python資料探勘講師 </a> </span> <span>技術類</span> <span>1</span> <span>上海</span> <span>2018-10-23</span> </div> </li> </ul>"""
以上這段是我們今天用到的例子,這是文字格式,以下圍繞這個來展開
首先,我們要把他轉換為HTML網頁形式,那就需要用到etree函數了,使用etree之前需要先導包
from lxml import etree #解析為HTML html = etree.HTML(text) print(html)
這時候列印html會發現不是我們想要的結果:
因為HTML網頁是不能直接打印出來的,我們需要把它轉換為字串然後進行輸出
#如果想看到HTML裡的內容需要轉換為字串型別並解碼d = etree.tostring(html,encoding='utf8').decode('utf8')print(d)
這時候輸出的就是我們想看到的,所以如果想要看內容一定要進行上述轉換
下面我們來提取一些資訊,作為練習
####獲取所有的div標籤 divs = html.xpath('//div') for div in divs: d = etree.tostring(div,encoding='utf8').decode('utf8') print(d) print('*'*50) ####獲取某個指定的div標籤 div = html.xpath('//div[1]') [0] print(etree.tostring(div,encoding='utf8').decode('utf8')) ####獲取所有id="even"的div標籤 divs = html.xpath('//div[@id="even"]') for div in divs: d = etree.tostring(div,encoding='utf8').decode('utf8') print(d) print('*'*50) ####獲取所有div的id屬性 ###/@可以用來獲取屬性的值 divs = html.xpath('//div/@id') print(divs) ####獲取所有a標籤的href屬性的值 hrefs = html.xpath('//a/@href') print(hrefs)
經過上述練習,我們來提取一下div中的所有職位資訊
####獲取div裡所有的職位資訊 divs = html.xpath('//div')[1:] works=[] for div in divs: work = {}#新建一個空字典 #獲取href url = div.xpath('.//a/@href')[0] #獲取a標籤的文字資訊 position = div.xpath('.//a/text()')[0] #獲取工作型別 work_type = div.xpath('.//span[2]/text()')[0] #獲取職位人數 work_num = div.xpath('.//span[3]/text()')[0] #獲取工作地點 area = div.xpath('.//span[4]/text()')[0] #獲取釋出時間 time = div.xpath('.//span[5]/text()')[0] work = { "url":url, "position":position, "work_type":work_type, "work_num":work_num, "area":area, "time":time } works.append(work) print(works)
上述程式碼跑完會發現:
works裡存放了所有的職位資訊
好了,今天的分享結束啦,如果有xpath看不懂的可以留言哦~