進一步了解XPath利用XPath爬取飛哥的博客)【python爬蟲入門進階】(04)

      網友投稿 750 2022-05-30

      您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦。

      本文是爬蟲專欄的第四篇,重點介紹lxml庫與XPath搭配使用解析網頁提取網頁內容。

      干貨滿滿,建議,系列文章持續更新。 小伙伴們如有問題及需要,歡迎踴躍留言告訴我哦~ ~ ~。

      前言(為什么寫這篇文章)

      上一篇文章我們簡單的介紹了Html與xml的基本概念,并且重點介紹了XPath的語法。這篇文章就讓我們來實戰一下: 通過本文你將學會如何 如何利用lxml庫來加載和解析網頁,然后搭配XPath的語法定位特定元素及節點信息的知識點。

      @[toc]

      lxml庫的介紹

      lxml庫是一個HTML/XML的解析器,主要功能是如何解析和提取HTML/XML的數據。

      lxml和正則一樣,也是用C語言實現的,是一款高性能的Python HTML/XML解析器。利用前面學習的XPath的語法來快速定位網頁上的特定元素以及節點信息。

      利用pip安裝lxm庫

      pip install lxml

      利用lxml庫解析HTML片段

      lxml庫可以解析傳入的任何一段XML或者HTML片段,當然前提是你的XML或者HTML片段沒有語法錯誤。

      #lxml_test.py from lxml import etree text = """

      全網ID名:碼農飛哥

      掃碼加入技術交流群!

      個人微信號
      """ # 利用etree.HTML將字符串解析成HTML文檔 html = etree.HTML(text) print("調用etree.HTML=", html) # 將Element對象序列化成字符串 result = etree.tostring(html) print("將Element對象序列化成字符串=", result) result2 = etree.tostring(html, encoding='utf-8').decode() print(result2)

      從上面的輸出結果可以看出etree.HTML(text) 方法可以將字符串解析成HTML文檔,也就是一個Element對象。etree.tostring(html) 可以將HTML文檔序列化成字符串,序列化之后的結果是一個 bytes 對象,中文是不能正常顯示的。需要通過指定編碼方式為utf-8,并且調用decode()方法中文才能正常輸出,并且輸出的HTML是有格式的。即不是打印成一行。

      利用lxml庫加載html文件

      lxml庫不僅僅可以解析XML/HTML片段,還可以解析完整的HTML/XML文件 。下面創建了一個名為test.html文件。然后通過 etree.parse方法進行解析。

      全網ID名:碼農飛哥

      掃碼加入技術交流群!

      個人微信號

      然后創建一個html_parse.py的文件進行解析,需要注意的是該文件跟test.html文件在同一個目錄下。

      # html_parse.py from lxml import etree #讀取外部文件 test.html html = etree.parse('./test.html') result = etree.tostring(html, encoding='utf-8').decode() print(result)

      解析結果是:

      可以看出如果被解析的HTML文件是一個標準的HTML代碼片段的話則可以正常加載,因為這里parse方法默認使用的是XML的解析器。

      但是當HTML文件是一個標準的完整的HTML文件則XML解析器是不能解析。現在將test.html 改下圖2的代碼,如果直接使用XML解析器解析就會報下面的錯誤。

      針對HTML文件需要通過HTMLParser方法設置HTML解析器。然后在parse方法指定該解析器,就像下面代碼所示的一樣。

      from lxml import etree # 定義解析器 html_parser = etree.HTMLParser(encoding='utf-8') # 讀取外部文件 test.html html = etree.parse('./test.html', parser=html_parser) result = etree.tostring(html, encoding='utf-8').decode() print(result)

      運行結果是:

      實戰開始

      了解了lxml方法的基本使用之后,接下來我們就以碼農飛哥的博客 為例。這里我們的需求是爬取他博客下所有文章(暫不包括文章內容),然后將爬取的數據保存到本地txt文件中。首先讓我們來看看他的博客長啥樣。涉及前面幾篇博客知識點這里不再詳細介紹了。這里重點介紹如何通過XPath來快速定位特定的元素和數據。

      第一步: 獲得文章的分組

      首先獲取文章的分組,還是使用萬能的XPath Helper, 通過F12調出調試窗口,可以看出每個文章分組都是放在

      。所以,通過 //div[@class="article-item-box csdn-tracking-statistics"] 表達式就可以獲取所有的文章分組。

      代碼示例如下:

      from lxml import etree import requests response = requests.get("https://feige.blog.csdn.net/", timeout=10) # 發送請求 html = response.content.decode() html = etree.HTML(html) # 獲取文章分組 li_temp_list = html.xpath('//div[@class="article-item-box csdn-tracking-statistics"]') print(li_temp_list)

      運行結果是:

      這里通過html.xpath('//div[@class="article-item-box csdn-tracking-statistics"]') 方法得到40個Element對象。這40個Element對象就是我們需要爬取的當前頁面的所有文章。 每個Element對象就是下面這樣的內容。

      接下來通過result = etree.tostring(li_temp_list[0], encoding='utf-8').decode() 方法序列化Element對象,得到的結果是:

      原創 淺識XPath(熟練掌握XPath的語法)【python爬蟲入門進階】(03)

      XPath 利器在手,解析爬蟲無憂

      2021-10-28 14:56:05 335 5

      第二步: 獲取文章的鏈接

      從上面的代碼我們可以看出文章的鏈接在 中,而a元素的父元素是h4元素,h4元素的父元素是

      元素。

      換成XPath的表達式就是//div[@class="article-item-box csdn-tracking-statistics"]/h4/a/@href ,即首先通過//div[@class="article-item-box csdn-tracking-statistics"] 選取所有的

      然后通過/h4找到他的子元素h4,在通過/a找到h4的子元素a。最后就是通過/@href 找到鏈接內容。

      不過第一步我們已經獲取到了

      元素的Element對象。所以,這里就不需要在重復寫//div[@class="article-item-box csdn-tracking-statistics"]了,只需要通過. 代替,表示在當前目錄下找。參考代碼如下:

      #省略第一步的代碼 href = li_temp_list[0].xpath('./h4/a/@href')[0] print(href)

      得到的結果是:https://feige.blog.csdn.net/article/details/121003473 。需要注意的是.xpath方法返回的是一個列表,所以需要提取其第一個元素

      第三步:獲取標題內容

      按照獲取鏈接的思想,我們同樣可以獲取標題內容。標題的內容就直接在a標簽里。這里只需要多一步就是通過text()方法提取a標簽的內容。表達式就是//div[@class="article-item-box csdn-tracking-statistics"]/h4/a/text()。

      參考代碼是:

      title_list = li_temp_list[0].xpath('./h4/a/text()') print(title_list) print(title_list[1])

      運行結果是:

      ['\n ', '\n 淺識XPath(熟練掌握XPath的語法)【python爬蟲入門進階】(03)\n '] 淺識XPath(熟練掌握XPath的語法)【python爬蟲入門進階】(03)

      因為列表中的第一個元素是\n,所以需要獲取第二個元素。

      完整的參考代碼

      import requests from lxml import etree import json import os class FeiGe: # 初始化 def __init__(self, url, pages): self.url = url self.pages = pages self.headers = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"} def get_total_url_list(self): """ 獲取所有的urllist :return: """ url_list = [] for i in range(self.pages): url_list.append(self.url + "/article/list/" + str(i + 1) + "?t=1") return url_list def parse_url(self, url): """ 一個發送請求,獲取響應,同時etree處理html :param url: :return: """ print('parsing url:', url) response = requests.get(url, headers=self.headers, timeout=10) # 發送請求 html = response.content.decode() html = etree.HTML(html) return html def get_title_href(self, url): """ 獲取一個頁面的title和href :param url: :return: """ html = self.parse_url(url) # 獲取文章分組 li_temp_list = html.xpath('//div[@class="article-item-box csdn-tracking-statistics"]') total_items = [] # 遍歷分組 for i in li_temp_list: href = i.xpath('./h4/a/@href')[0] if len(i.xpath('./h4/a/@href')) > 0 else None title = i.xpath('./h4/a/text()')[1] if len(i.xpath('./h4/a/text()')) > 0 else None summary = i.xpath('./p')[0] if len(i.xpath('./p')) > 0 else None # 放入字典 item = dict(href=href, text=title.replace('\n', ''), summary=summary.text.replace('\n', '')) total_items.append(item) return total_items def save_item(self, item): """ 保存一個item :param item: :return: """ with open('feige_blog.txt', 'a') as f: f.write(json.dumps(item, ensure_ascii=False, indent=2)) f.write("\n") def run(self): # 找到url規律,url_list url_list = self.get_total_url_list() os.remove('feige_blog.txt') for url in url_list: # 遍歷url_list發送請求,獲得響應 total_item = self.get_title_href(url) for item in total_item: print(item) self.save_item(item) if __name__ == '__main__': fei_ge = FeiGe("https://feige.blog.csdn.net/", 8) fei_ge.run()

      運行結果是:

      該類主要分為幾大塊。

      初始化方法__init__(self, url, pages) 主要設置需要爬取的博客的域名,以及博客的頁數,以及初始化請求頭。

      獲取所有頁數的鏈接的方法get_total_url_list(self) ,這里需要注意的鏈接的規律。

      parse_url(self, url) 方法主要就是根據傳入的url獲得該url的html頁面。

      get_title_href(self, url) 方法主要分為兩塊,第一塊就是調用parse_url(self, url) 方法得到鏈接對應的html頁面。第二塊就是解析HTML頁面以定位到我們需要的數據的元素,并將元素放在列表total_items中返回。

      save_item(self, item) 方法就是將第四步返回的total_items中的數據保存到feige_blog.txt文件中。

      run(self) 方法是主入口,統籌調用各個方法。

      總結

      本文通過碼農飛哥演示了如何在實戰中使用XPath來爬取我們想要的數據。

      HTML Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:搭建高可用MongoDB集群(Replica set)【綻放吧!數據庫】
      下一篇:脫離虛擬機,windows系統連接開發板
      相關文章
      亚洲综合久久成人69| 亚洲美女在线观看播放| 中文日韩亚洲欧美制服| 亚洲精品视频专区| 久久亚洲春色中文字幕久久久| 国产V亚洲V天堂无码久久久| 亚洲精品白浆高清久久久久久| 亚洲熟妇无码八AV在线播放| 综合亚洲伊人午夜网 | 亚洲性无码一区二区三区| 亚洲av永久无码精品天堂久久| 亚洲网站视频在线观看| 亚洲毛片免费观看| 亚洲免费观看在线视频| 中文字幕亚洲男人的天堂网络| 亚洲不卡在线观看| 亚洲精品免费网站| 亚洲精华国产精华精华液网站| 亚洲乱亚洲乱妇24p| 亚洲爆乳无码专区www| 国产精品亚洲专区一区| 亚洲AV无码成H人在线观看| 亚洲精品在线视频| 在线a亚洲v天堂网2019无码| 亚洲精品无码国产| 午夜亚洲国产理论秋霞| 亚洲色偷偷偷网站色偷一区| 亚洲国产中文在线二区三区免| 亚洲一区在线免费观看| 亚洲熟妇自偷自拍另欧美| 亚洲av无码偷拍在线观看| 亚洲?V无码乱码国产精品| 久久99亚洲综合精品首页| 亚洲精品国产成人片| 亚洲AV成人无码久久精品老人| 亚洲视频精品在线观看| 亚洲娇小性xxxx色| mm1313亚洲国产精品无码试看| 亚洲色偷偷综合亚洲AV伊人| 国产精品亚洲片在线观看不卡 | 久久久久久久久亚洲|