python爬虫快速入门
创始人
2025-05-28 10:46:40

selector库

xpath语法常用规则
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点,而不考虑它们的位置,跨节点获取标签
. 选取当前节点
… 选取当前节点的父节点
@ 选取属性
text() 选取文本
可以配合使用.//意思是当前节点所有子孙节点

1、获取标签的xpath路径
在这里插入图片描述
在这里插入图片描述

2、通过class获取table下的tbody标签的tr列表,获取到的是一个数组(注:前面加.)
在这里插入图片描述

3、从数组的第二个开始获取(注:前面加.)

all_trs = response.xpath("//table[@class='forums_tab_table']//tr")[2:]

4、获取tr标签的第二个td标签(注:前面加.)

if tr.xpath(“.//td[1]/span/text()”).extract():
status = tr.xpath(“.//td[1]/span/text()”).extract()[0]
topic_item[“status”] = status

5、获取text,获取到的东西都是数组,所以我们要获取第0个元素(注:前面加.)

 create_time = answer_item.xpath(".//label[@class='date_time']/text()").extract()[0]

6、获取a标签里面的href的值(注:前面加.)

 next_page = response.xpath("//a[@class='pageliststy next_page']/@href").extract()

7、获取数组的最后一个元素 -1(注:前面加.)

author_id = author_url.split("/")[-1]

8、提取时间格式(注:前面加.)

create_time = tr.xpath(".//td[4]/em/text()").extract()[0]
create_time = datetime.strptime(create_time, "%Y-%m-%d %H:%M")

9、找下一页的url,涉及到递归

last_time_str = tr.xpath(".//td[6]/em/text()").extract()[0]
last_time = datetime.strptime(last_time_str, "%Y-%m-%d %H:%M") // 将字符串转换成时间类型

10、防止报错写法

if tr.xpath(“.//td[1]/span/text()”).extract():
status = tr.xpath(“.//td[1]/span/text()”).extract()[0]
topic_item[“status”] = status

11、区分插入数据还是更新数据

def save(self):
topic = Topic()
topic.title = self[“title”]
topic.content = self[“content”]
topic.id = self[“id”]
topic.author = self[“author”]
topic.create_time = self[“create_time”]
topic.answer_nums = self.get(“answer_nums”, 0)
topic.click_nums = self.get(“click_nums”, 0)
topic.praised_nums = self.get(“praised_nums”, 0)
topic.jtl = self.get(“jtl”, 0)
topic.score = self.get(“score”, 0)
topic.status = self[“status”]
topic.last_answer_time = self[“last_answer_time”]existed_topics = Topic.select().where(Topic.id == topic.id)
if existed_topics:topic.save()
else:topic.save(force_insert=True)

12、记住.//和//是不一样的,为了防止错误,我们全部都要使用.//

13、数字和文本混合在一起,我们应该怎么把数字提取出来呢

jtl_match = re.search("(\d+)%", jtl_str)if jtl_match:jtl = int(jtl_match.group(1))

14、获取div标签,并且是以id的值以post-开头

all_divs = response.xpath("//div[starts-with(@id, 'post-')]")

相关内容

热门资讯

基于bearpi的智能小车--... 基于bearpi的智能小车--Qt上位机设计 前言一、界面原型1.主界面2.网络配置子窗口模块 二、...
三、Java核心技术(进阶)-... 一、概念 国际化编程:通过一套软件适配多个语言包。 二、相关函数 java.util....
水声功率放大器与宽带匹配技术研...   作为声呐设备重要的一份子,水声信号发射机承担着非常重要的作用。水声信号发射机其实是...
【C++】12.继承 1.引入继承 学生管理系统 学生 老师 社管阿姨 保安大叔 4个类 4个类有很多重复的东西...
LINUX中atd和crond... 一、atd与crond的区别1、运行方式不同,at只运行一次,而cron...
C++数据结构 —— 哈希表、... 目录 1.哈希概念 1.1哈希函数 1.2哈希冲突 2.闭散列实现 3.开散列实现 4.容器的封装 ...
Streamlit 学习笔记1 Streamlit 学习笔记1 文章目录Streamlit 学习笔记1首先 安利下streamlit...
基层区域应用平台为目标开发的基... 系统特点:  JAVA语言开发,MYSQL数据库,B/S架构 基于云计算...
数智链接,新一代校园招聘解决方... 疫情3年市场巨变,00后新生代初登上求职舞台,中和作用下,...
面试官:rem和vw有什么区别 "rem" 和 "vw"的区别 "rem" 和 "vw" 都是用于网页设计的CSS单位。 "rem"...
Pytest自动化测试框架完美... 简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工具。 不仅可以以简洁的网...
华为nat配置实验:内网能够访... 一 需求分析1.1 需求 公司A在北京,公司B在上海,本次实验仅仅模拟局...
事务日志与 两阶段提交 文章目录 Redo Logredo的优点redo的组成redo的整体流程不同刷盘策略演示 Undo ...
【目标跟踪算法】Strong ... 1. Strong SORT算法的背景和概述 Strong SORT算法基于经典的Deep SORT...
Lock接口——JUC随记2 1、synchronized 1.1、synchronized的三种应用方式 一. 修饰实例方法&#...
IO流之字符流 文章目录1. 字符流概述2. 编码表3. 编码和解码4. 写数据的方式5. 读数据的方式6. 转换流...
C语言的灵魂---指针(基础) C语言灵魂指针1.什么是指针?2.指针的大小3.指针的分类3.1比较常规的指针类型3....
【华为OD机试真题JAVA】最... 标题:最优策略组合下的总的系统消耗资源数问题 | 时间限制:1秒 | 内存限制:262144K | ...
MATLAB | 给热图整点花... 前段时间写的特殊热图绘制函数迎来大更新,基础使用教程可以看看这一篇: h...
小知识·BitTorrent ... BitTorrent 简介从 P2P 说起经常在网上飙车的老司机应该都知道 BT 下载,...
Redis和Memcached...         对于大多数的系统服务来说,缓存是提高性能和可伸缩性的关键。一般情况下我...
[牛客算法总结]:重建二叉树    标签: 二叉树、DFS、先序遍历、中序遍历、递归   题目: 给定...
VS Code 将推出更多 A... 大家好,欢迎来到我们的二月更新!我们将为您带来与 JUnit 5 并行测...
为什么要推荐使用pnpm 在谈起pnpm时先来聊一聊之前的npm和yarn有什么存在的问题  npm2 在npm3之前我们安装...
多线程开发 文章目录多线程开发1. Thread创建多线程2. ThreadPoolExecutor创建进程池a...
闪存系统性能优化方向?NAND... Hello 大家好, 我是元存储~ 目录 前言 1. 提升效果 2. Cache Re...
关于复杂链表的复制问题(力扣) 上面我们已经说了两个关于链表的实现了,其中一个是单链表,另外一个是双向带...
STM32学习(二) 常用开发工具简介 安装仿真器驱动 DAP仿真器免驱ST LINK仿真器驱动安装方法:...
K8s配置jenkins Ma... 1、k8s安装jenkins 以阿里云的ACK为例 A、在有状态点击镜像创建,配置自己...
2023年新一代设备管理系统—... 设备管理是指在企业或者工厂对设备的生命周期进行管理、维护和保养等工作。设备管理系统是企业内部的信息管...