學習lxml和xpath

xml是一種標記語法的文本格式,xpath可以方便的定位xml中的元素和其中的屬性值。html也屬于標記語言,可以用xpath來獲取想要的對象和屬性。
lxml是python中的一個包,這個包中包含了將html文本轉成xml對象,和對對象執(zhí)行xpath的功能。

以下是xpath的常用路徑選擇語法:

  • 節(jié)點名 選取此節(jié)點下的所有子節(jié)點
  • / 從根節(jié)點選取
  • // 從匹配選擇的當前節(jié)點選擇文檔中的節(jié)點,而不考慮它們的位置。
  • @ 選取屬性

以下是一個練習,爬取,貼吧的圖片:

思路:

1. 根據url變化寫出,列表頁的url表達式

2. 訪問列表頁,通過xpah獲取每條內容的鏈接

3. 通過連接進入詳情頁,獲取其中的圖片鏈接

4. 通過圖片src 訪問圖片,并保存在本地

這里講一個大坑

從瀏覽器中通過xpath,能匹配到


enter description here
enter description here

但是在代碼中運行卻不能,
經過一番折騰終于發(fā)現了,查看response文本,
竟然發(fā)現body部分被注釋掉了,那么取消掉注釋就可以匹配到了。

# coding=utf8

import urllib
import urllib2
from lxml import etree


headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
def load_page(url):
    """
    作用:根據url發(fā)送請求,獲取服務器相應文件
    url: 需要爬取的url地址
    """

    request = urllib2.Request(url,headers=headers)


    response = urllib2.urlopen(request).read().replace('<!--','').replace('--!>','')
    # with open('sss.html','w') as f:
    #     f.write(response)

    links =  etree.HTML(response).xpath(r'//div[@class="t_con cleafix"]/div/div/div/a/@href')
    print links
    for link in links:
        load_img(link)
        print('*************')
        print link

def load_img(link):

    url = 'https://tieba.baidu.com'+link

    request = urllib2.Request(url,headers=headers)
    response = urllib2.urlopen(request).read()
    # with open('s.html','w') as f:
    #     f.write(response)
    my_xml = etree.HTML(response)
    img_list = my_xml.xpath(r'//img[@class="BDE_Image"]/@src')
    for img_src in img_list:
        write_img(img_src)

def write_img(src):
    request = urllib2.Request(src,headers=headers)
    response = urllib2.urlopen(request).read()
    with open('img/'+src[-15:],'wb') as f:
        f.write(response)

def tieba_spider(url,bagin_page,end_page):
    '''
    作用;貼吧爬蟲調度器,負責組合處理每個頁面的url
    url :貼吧url前部分

    '''

    #每一頁一頁的爬,用for
    for i in range(bagin_page,end_page+1):
        pn = (i-1)*50 #這里是百度貼吧表示 頁碼的方式
        ful_url = url +'&pn=' +str(pn)
        print ful_url
        file_name = '第' + str(i) +'頁.html'
        #調用load_page
        load_page(ful_url)



if __name__ == '__main__':
    kw = raw_input("輸入貼吧名:")
    begain_page = int(raw_input('起始頁:'))
    end_page = int(raw_input('輸入結束頁'))

    url ='https://tieba.baidu.com/f?'
    key = urllib.urlencode({'kw':kw})

    ful_url = url  +key

    tieba_spider(ful_url,begain_page,end_page)

這樣就爬取了文章中的圖片了:


enter description here
enter description here

總結:

  1. 通過xpth獲取節(jié)點時,要分析html結構。
  2. 瀏覽器上和用urlopen獲得的html會有不同,以response為準
  3. lmxl具有xpath功能
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容