1. 程式人生 > 其它 >爬蟲—lxml提取資料

爬蟲—lxml提取資料

我們好久不見~

來更新部落格啦!最近在學爬蟲,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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;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&amp;keywords=python&amp;tid=87&amp;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看不懂的可以留言哦~