xpath练习-CSDN论坛

关于xpath的具体教程可以看崔大神的这篇:https://cuiqingcai.com/2621.html

  1. 安装lxml:pip install lxml
  2. 路径表达式
表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

实例代码:

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">节点关系</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)

# 根据标签名称选取此节点,如body等
result = data.xpath('body')

# / 从根节点选取
result = data.xpath('/html/head/meta')

# // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
# 获取所有的<ol>标签
result = data.xpath('//ol')
# . 选取当前节点
#  选取当前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中,便于后续的数据保存
                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阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352