xpath練習-CSDN論壇

關于xpath的具體教程可以看崔大神的這篇:https://cuiqingcai.com/2621.html

  1. 安裝lxml:pip install lxml
  2. 路徑表達式
表達式 描述
nodename 選取此節(jié)點的所有子節(jié)點
/ 從根節(jié)點選取
// 從匹配選擇的當前節(jié)點選擇文檔中的節(jié)點院崇,而不考慮它們的位置
. 選取當前節(jié)點
.. 選取當前節(jié)點的父節(jié)點
@ 選取屬性

實例代碼:

from lxml import etree

text = """
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=7,9,10,11"/>
    <meta name="renderer" content="webkit">
    <title>Title</title>
</head>
<body>
<div class="catalog-list column-3">
<ol>
<li class="level1">
<span class="index">1</span>
<span class="text"><a href="#1">簡介</a></span>
</li>
<li class="level1">
<span class="index">2</span>
<span class="text"><a href="#2">語法</a></span>
</li>
<li class="level1">
<span class="index">3</span>
<span class="text"><a href="#3">表達式</a></span>
</li>
<li class="level2">
<span class="index">4</span>
<span class="text"><a href="#4">運算符</a></span>
</li>
</ol><ol><li class="level1">
<span class="index">5</span>
<span class="text"><a href="#5">標準函數</a></span>
</li>
<li class="level3">
<span class="index">6</span>
<span class="text"><a href="#6">使用</a></span>
</li>
<li class="level1">
<span class="index">7</span>
<span class="text"><a href="#7">標準</a></span>
</li>
<li class="level1">
<span class="index">8</span>
<span class="text"><a href="#8">軸定義</a></span>
</li>
</ol><ol><li class="level4">
<span class="index">9</span>
<span class="text"><a href="#9">節(jié)點關系</a></span>
</li>
<li class="level4">
<span class="index">10</span>
<span class="text"><a href="#10">存取函數</a></span>
</li>
<li class="level4">
<span class="index">11</span>
<span class="text"><a href="#11">語言升級</a></span>
</li>
<li class="level4">
<span class="index">12</span>
<span class="text"><a href="#12">實例</a></span>
</li>
</ol>

    <ol>
        <li>A</li>
        <li>A</li>
        <li>A</li>
    </ol>

</div>

</body>
</html>
"""

#  數據初始化
data = etree.HTML(text)

# 打印初始化的數據
result = etree.tostring(data)
print(result)

# 根據標簽名稱選取此節(jié)點理朋,如body等
result = data.xpath('body')

# / 從根節(jié)點選取
result = data.xpath('/html/head/meta')

# // 從匹配選擇的當前節(jié)點選擇文檔中的節(jié)點堕战,而不考慮它們的位置帜消。
# 獲取所有的<ol>標簽
result = data.xpath('//ol')
# . 選取當前節(jié)點
#  選取當前result下的<li>標簽
li = result[0].xpath('./li')

# @ 選取屬性
# 獲取 <li> 標簽的所有 class
result = data.xpath('//li/@class')
print(result)
# 獲取所有<a>標簽的href值
result = data.xpath('//a/@href')
print(result)

# 獲取 <li> 標簽下 href 為 #7 的 <a> 標簽
result = data.xpath('//li//a[@href="#7"]')

# 獲取 <li> 標簽下的所有 <a> 標簽
result = data.xpath('//li//a')    #<a> 并不是 <li> 的子元素描孟,所以鳞溉,要用雙斜杠

CSDN實例

import requests
from lxml import etree
import json

# 爬取CSDN論壇信息的類
class BBSpider:
    url = "https://bbs.csdn.net/tech_hot_topics"
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}

    # 存放最終的數據恍风,用于數據存儲
    result_list = []

    # 根據給到的url獲取網頁數據并返回
    def get_data(self, url):
        r = requests.get(url=url, headers=self.headers)
        data = r.text
        return data

    # 解析得到的網頁數據堪簿,分析出該頁的帖子的時間棒旗、帖子標題喘批、帖子鏈接
    def parse_data(self, data, url):
        # 將網頁的數據進行轉化
        html = etree.HTML(data)
        if data is not None:
            # 帖子內容都在class="list_1"的div標簽中,在無序列表ul铣揉,以li標簽的形式進行展示
            div = html.xpath('//div[@class="list_1"]//li')
            # 遍歷每個li標簽饶深,獲取li標簽中包含的時間time、帖子標題content逛拱、帖子鏈接link
            for tiezi in div:
                dict = {}
                # 獲取li標簽中包含的時間time
                dict['time'] = tiezi.xpath('./span/text()')[0]
                # 獲取li標簽中包含的帖子標題content
                dict['content'] = tiezi.xpath('./a/text()')[0]
                # 獲取li標簽中包含的帖子鏈接link
                dict['link'] = 'https://bbs.csdn.net' + tiezi.xpath('./a/@href')[0]
                # 將獲取到的帖子信息存放到類成員變量result_list中敌厘,便于后續(xù)的數據保存
                self.result_list.append(dict)
        else:
            print("NO Data: "+url)
    
    # 存儲數據,將result_list中的數據以json的格式保存到data.json文件中
    def save_data(self):
        data = json.dumps(self.result_list)
        with open("data.json", "w") as f:
            f.write(data)

    # 由于CSDN的論壇是以翻頁的形式進行展示的朽合,翻頁的鏈接為:域名+"?page=xxx",以下是對每一頁的數據進行數據的獲取俱两、解析,最后保存的操作
    def run(self):
        # 獲取從第1頁到第9頁的數據
        for i in range(1,10):
            url = self.url + "?page="+str(i)
            data = self.get_data(url)
            self.parse_data(data, url)
        print(len(self.result_list))
        # 保存第1頁到第9頁全部的網頁數據
        self.save_data()

# 對CSDN的論進行網頁爬取
spider = BBSpider()
spider.run()

運行結果

生成了一個data.json文件曹步,文件內容如下:

[{"content": "\u6709\u4e2a\u81ea\u8eab\u8fed\u4ee3\u51fa\u73b0\u4e86\u95ee\u9898\uff0c\u65e0\u6cd5\u7406\u89e3\u554a", "link": "https://bbs.csdn.net/topics/392468373", "time": "2018-10-27 12:10:41"}, {"content": "\u8fde\u7eed\u5c1d\u8bd56\u5c0f\u65f6\u65e0\u679c \u80fd\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u7684\u4eba\u53ef\u80fd\u4e0d\u8d85\u8fc73\u4e2a", "link": "https://bbs.csdn.net/topics/392468284", "time": "2018-10-27 02:44:34"}, {"content": "Http\u8bf7\u6c42header\u4e2d\u81ea\u5b9a\u4e49\u7684\u53c2\u6570\u662f\u5982\u4f55\u4f20\u5230PHP SERVER\u53d8\u91cf\u4e2d\u7684", "link": "https://bbs.csdn.net/topics/392468081", "time": "2018-10-26 16:39:40"}, {"content": "\u6709\u73b0\u6210winform\u57fa\u4e8e.net FX2.0\u7684\uff0c\u73b0\u5728\u7528\u8f6c\u79fb\u5230LINUX\u4e0a", "link": "https://bbs.csdn.net/topics/392468065", "time": "2018-10-26 16:25:51"}······]

以下為相關的解析:


網頁解析思路

具體代碼鏈接:https://github.com/zhuyecao/kaikeba/tree/master/kaikeba/xpath

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末宪彩,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子讲婚,更是在濱河造成了極大的恐慌尿孔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筹麸,死亡現場離奇詭異活合,居然都是意外死亡,警方通過查閱死者的電腦和手機物赶,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門白指,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人块差,你說我怎么就攤上這事侵续。” “怎么了憨闰?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵状蜗,是天一觀的道長。 經常有香客問我鹉动,道長轧坎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任泽示,我火速辦了婚禮缸血,結果婚禮上蜜氨,老公的妹妹穿的比我還像新娘。我一直安慰自己捎泻,他們只是感情好飒炎,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笆豁,像睡著了一般郎汪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闯狱,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天煞赢,我揣著相機與錄音,去河邊找鬼哄孤。 笑死照筑,一個胖子當著我的面吹牛,可吹牛的內容都是我干的瘦陈。 我是一名探鬼主播凝危,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼双饥!你這毒婦竟也來了媒抠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤咏花,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阀趴,有當地人在樹林里發(fā)現了一具尸體昏翰,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年刘急,在試婚紗的時候發(fā)現自己被綠了棚菊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡叔汁,死狀恐怖统求,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情据块,我是刑警寧澤码邻,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站另假,受9級特大地震影響像屋,放射性物質發(fā)生泄漏。R本人自食惡果不足惜边篮,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一己莺、第九天 我趴在偏房一處隱蔽的房頂上張望奏甫。 院中可真熱鬧,春花似錦凌受、人聲如沸阵子。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽款筑。三九已至,卻和暖如春腾么,著一層夾襖步出監(jiān)牢的瞬間奈梳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工解虱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留攘须,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓殴泰,卻偏偏與公主長得像于宙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子悍汛,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345