Python爬虫之pyquery和parsel的使用

三、pyquery的使用

1、准备工作

pip3 install pyquery

2、初始化

2.1、字符串初始化

把HTML的内容当做参数,来初始化PyQuery对象。

html = '''
<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold>third item</span></a></li><li class="item-0 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul>
</div>
'''
from pyquery import PyQuery as pq
doc = pq(html)		# 将HTML作参数传给pq,完成初始化
print(doc('li'))

2.2、URL初始化

指定PyQuery对象的参数为url

from pyquery import PyQuery as pq
doc = pq(url='https://cuiqingcai.com')	
print(doc('title'))# 和以下代码功能相同
doc = pq(requests.get('https://cuiqingcai.com').text)
print(doc('title'))

2.3、文件初始化

from pyquery import PyQuery as pq
doc = pq(filename='demo.html')
print(doc('title'))

3、基本CSS选择器

html = '''
<div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold>third item</span></a></li><li class="item-0 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul>
</div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))		# 选取id为container的节点,再选取其内部class为list的节点内部的所有li节点
print(type(doc('#container .list li')))	#PyQuery类型for item in doc('#container .list li').items():	# 遍历输出print(item.text())

4、查找节点

4.1、子节点

查找子节点时,需要用到find方法,其参数是CSS选择器。

items = doc('.list')		# 选取class为list的节点
print(type(items))
print(items)
lis = items.find('li')		# 选取其内部的li节点
print(type(lis))			# PyQuery类型
print(lis)

如果要筛选所有子节点中符合条件的节点,可向children方法传入CSS选择器

lis = items.children()
lis = items.children('.active')

4.2、父节点

可以用parent方法获取某个节点的父节点

container = items.parent()
print(type(container))			# 类型还是PyQuery
print(container)

可以用parents方法获取某个节点的祖先节点。

parents = items.parents()
print(type(parents))			# 类型还是PyQuery
print(container)

可传入参数筛选祖先节点

parent = items.parents('.wrap')
print(parent)

4.3、兄弟节点

li = doc('.list .item-0.active')
print(li.siblings())

5、遍历节点

  • pyquery 的选择结果可能是多个节点,也可能是单个节点,类型都是PyQuery类型,并没有像Beautiful Soup那样返回列表。

  • 如果结果是单个节点,既可以直接打印输出,也可以直接转成字符

    doc  = pq(html)
    li = doc('.item-0.active')
    print(li)
    print(str(li))
  • 如果是多个节点,就需要遍历获取了。需要调用items方法

    doc  = pq(html)
    lis = doc('li').items()
    print(type(lis))
    for li in lis:print(li,type(li))

5.1、获取信息

比较重要的信息有两类,一是属性、二是文本。

5.1.1、获取属性

提取到某个PyQuery类型的节点后,可以调用attr方法获取其属性

doc = pq(html)
a = doc('.item-0.active a')
print(a,type(a))
print(a.attr('href')) / print(a.attr.href)
  • 当返回结果包含多个节点时,调用attr方法,只会得到第一个节点的属性。
  • 如果要获取所有的,则需要遍历
from PyQuery import PyQuery as pq
doc = pq(html)
a = doc('a')
for item in a.items():print(items.attr('href'))
5.1.2、获取文本

获取节点内部的文本,可以调用text方法

from pyquery import PyQuery as pq
html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold>third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>
</div>
'''doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())
  • 这里首先选中a节点,然后调用text方法,就可以获取其内部的文本信息。此时text方法会忽略节点内部包含的所有HTML,只返回纯文字内容。
  • html方法会得到节点内部的HTML文本。
  • 如果得到的是多个节点,并且想获取所有节点的内部HTML文本,就要遍历这些节点。而text方法不需要遍历即可得到,会对所有节点取文本之后合成一个字符串。

6、节点操作

pyquery库提供了一些列方法对节点进行动态修改,例如为某个节点添加一个class,移除某个节点等。

6.1、add_class和remove_class

html = '''
<li class="item-0 active"><a href="link3.html"><span class="bold>third item</span></a></li>
'''
doc = pq(html)
li = doc('.item-0.active')
li.remove_class('active')
li.add_class('active')

6.2、attr、text和html

doc = pq(html)
li = doc('.item-0.active')
li.attr('name','link')
li.text('changed item')
li.html('<span>changed item</span>')
  • attr方法第一个参数为属性名,第二个参数为属性值。若值传入一个参数,表示获取这个属性值。
  • 调用text方法和html方法改变li节点内部的内容。如果传入参数则表示赋值。

6.4、remove

html = '''
<div class="wrap">Hello, World<p>This is a paragraph.</p>
</div>
'''
doc = pq(html)
wrap = doc('.wrap')
wrap.find('p').remove()
print(wrap.text())# 首先选中p节点,然后调用remove方法将其移除,这时wrap内部就只剩下Hello World这句话了,再利用text方法提取即可。

7、伪类选择器

li = doc('li:first-child')      # 选择了第一个li节点
li = doc('li:last-child')       # 选择了最后一个li节点
li = doc('li:nth-child(2)')		# 第二个li节点
li = doc('li:gt(2)')			# 第三个之后的li节点
li = doc('li:nth-child(2n)')	# 偶数位置的li节点
li = doc('li:contains(second)') # 包含second文本的li节点

查看更多:http://pyquery.readthedocs.ip

四、parsel的使用

1、介绍

parsel库可以解析HTML和XML,并支持使用XPath和CSS选择器对内容进行提取和修改,同时还融合了正则表达式的提取功能。主流!!

2、准备工作

 pip3 install parsel 

3、初始化

html = '''
<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold>third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul>
</div>
'''from parsel import Selector
selector = Selector(text=html)      # 创建了一个Selector对象,传入text参数
items = selector.css('.item-0')
print(len(items),type(items),items)items2 = selector.xpath('//li[contains(@class,"item-0")]')
print(len(items2),type(items2),items2)
  • 两个结果都是SelectorList对象,这其实是一个可迭代对象
  • len方法获取了结果的长度。
  • 每个节点还是以Selector对象的形式返回,其中每个Selector对象的data属性里包含对应提取节点的HTML代码。

4、提取文本

对上述可迭代对象SelectorList,要获取所有li节点的文本内容,就需要遍历了。

items = selector.css('.item-0')
for item in items:text = item.xpath('.//text()').get()print(text)
result = selector.xpath('//li[contains(@class,"item-0")]//text()').get()
# 这里使用//li[contains(@class,"item-0")]//text()选取了所有class包含item-0的li节点的文本内容。这里get只提取了第一个Selector对象的结果
result = selector.xpath('//li[contains(@class,"item-0")]//text()').getall()
# 使用getall则会提取所有
# css写法:
result = selector.css('.item-0 *::text').getall

5、提取属性

# 例如提取第三个li节点的href属性
result = selector.css('.item-0.active a::attr(href)').get()
result = selector.xpath('//li[contains(@class,"item-0") and contains(@class,"active")]/a/@href').get()
  • 对于CSS选择器,选取属性需要加**::attr(),并传入对应的属性名称**才可选取;
  • 对于XPath,直接用**/@再加属性名称**即可选取。

6、正则提取

result = selector.css('.item-0').re('link.*')
# 先用css方法提取所有class包含item-0的节点,然后使用re方法传入了link.*,用来匹配包含link的所有结果。
  • 当然,如果在调用css方法时,已经提取了进一步的结果,例如提取了节点文本值,那么re方法就只会针对节点文本进行提取:
result = selector.css('.item-0 *::text').re('.*item')
  • 也可用re_first方法来提取第一个符合规则的结果:
result = selector.css('.item-0').re_first('<span class="bold>(.*?)</span>')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 窗口MainWindow(上)

Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;继承自 QWidget 类&#xff0c;并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏&#xff08;menubar&#xff09;、多个工具栏(toolbars)、多个浮动窗口&#xff08;…

第十四届蓝桥杯JavaA组省赛真题 - 特殊日期

解题思路&#xff1a; 暴力秒了 public class Main {public static void main(String[] args) {int cnt 0;for (int i 1900; i < 9999; i) {for (int j 1; j < 12; j) {for (int k 1; k < days(i, j); k) {if (sum(i) sum(j) sum(k)) cnt;}}}System.out.print…

安防监控视频汇聚平台EasyCVR启用图形验证码之后如何调用login接口?

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

【Vue】可拖拽侧边栏实现

在本篇博客中&#xff0c;我们将探讨如何在 Vue.js 项目中实现一个可拖拽的侧边栏。此功能可以通过修改 HTML 和 Vue 组件的脚本来实现。 首先&#xff0c;我们需要在 HTML 文件中定义侧边栏的容器和用于拖拽的元素。在 Vue 组件中&#xff0c;我们将使用 Vue 的响应式系统来追…

力扣73. 矩阵置零

Problem: 73. 矩阵置零 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;利用一个等大的矩阵判定 复制一个与原始矩阵一样大的矩阵temp&#xff0c;遍历temp时若temp[i][j] 0&#xff0c;则将martix对应的行与列均设置为0 思路2&#xff1a;利用两个一维矩阵…

【Linux】UnixBench介绍、分数调优思路以及测试2D3D的方法

一.简介 unixbench是一个用于测试unix系统性能的工具&#xff0c;也是一个比较通用的benchmark&#xff0c; 此测试的目的是对类Unix 系统提供一个基本的性能指示&#xff0c;很多测试用于系统性能的不同方面&#xff0c;这些测试的结果是一个指数值&#xff08;index value&am…

幻兽帕鲁服务器价格表_阿里云/腾讯云/京东云/华为云报价大全

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

C++类的六个默认成员函数(详细解析与总结)

目录 前言&#xff1a; 一、构造函数 a.特点 b.注意事项 1.首先明确什么是默认构造函数 2.默认构造函数对内置类型与自定义类型的处理 c.总结 二、析构函数 a.特点 b.注意事项 1.什么时候写析构函数&#xff1f; 2.析构函数对内置类型与自定义类型的处理 c.总结 …

pythonselenium自动化测试实战项目

说明&#xff1a;本项目采用流程控制思想&#xff0c;未引用unittest&pytest等单元测试框架 一.项目介绍 目的 测试某官方网站登录功能模块可以正常使用 用例 1.输入格式正确的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b; 2.输入格式正确的用户名和不…

【面试经典 | 150】单词拆分

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【字符串】 题目来源 139. 单词拆分 解题思路 方法一&#xff1a;动态规划 定义状态 定义 dp[i] 表示字符串 s 前 i 个字符组成的字符串&#xff08;s[0, ..., i-1]&#xff09;是否能被…

【Node.js】模块化

概述 Nodejs 模块化规范遵循两套规范&#xff1a; Common JSES Module Common JS 引入模块&#xff08;require&#xff09;支持四种格式 支持引入内置模块例如 http os fs child_process 等const fs require(fs)&#xff0c;高版本也可以使用const fs require(node:fs…

【Java SE】封装

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 封装1.1 封装是什么1.2 封装的意义1.3 访问修饰限定符1.3.1 在Java中如何实现封装1.3.2 各种访问修饰限定…

SpringCloud微服务集成Dubbo

1、Dubbo介绍 Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服…

【二叉树】Leetcode 230. 二叉搜索树中第K小的元素【中等】

二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1 解…

在 fstab文件中配置 UUID方式自动挂载数据盘、swap、目录(**)

linux如何挂在硬盘&#xff0c;自动挂载和手动挂载&#xff08;详细说明&#xff09;https://gitcode.csdn.net/65eedcea1a836825ed7a06f4.html 解决linux重启后磁盘挂载失效的问题 https://blog.csdn.net/sugarbliss/article/details/107033034 linux /etc/fstab 文件详细说…

UG NX二次开发(C#)-通过曲线组生成NURBS曲面

文章目录 1、前言2、UG NX中通过曲线组生成NURBS曲面的操作3、采用NXOpen C#方法的源代码1、前言 在UG NX中,曲线、曲面的操作使用比较多,对于创建NURBS曲面,可以通过曲线组来生成,本文以NXOpen C#的方法实现通过曲线组生成NURBS曲面的功能。对于UG NX二次开发感兴趣或者有…

探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较

title: 探索多种数据格式&#xff1a;JSON、YAML、XML、CSV等数据格式详解与比较 date: 2024/3/28 17:34:03 updated: 2024/3/28 17:34:03 tags: 数据格式JSONYAMLXMLCSV数据交换格式比较 1. 数据格式介绍 数据格式是用于组织和存储数据的规范化结构&#xff0c;不同的数据格…

【aws】架构图工具推荐

碎碎念 以前以为日本冰箱论是个梗&#xff0c;结果居然是真的。用光盘传真其实还能理解&#xff08;毕竟我也喜欢电子古董2333&#xff09;&#xff0c;但是画架构图居然用的是excel&#xff0b;截图&#xff01;啊苍天呐&#xff0c;然后看到隔壁工位用excel画web原型又感觉释…

将数字城市复制到虚拟空间,如何搭建实景三维虚拟场景?

什么是实景三维&#xff1f; 实景三维&#xff08;3D Real Scene&#xff09;是一个专业术语&#xff0c;它指的是对一定范围内人类生产、生活和生态空间进行真实、立体、时序化反映和表达的数字虚拟空间。它是新型基础测绘的标准化产品&#xff0c;也是国家重要的新型基础设施…

权限提升-系统权限提升篇数据库提权PostsqlRedis第三方软件提权密码凭据钓鱼文件

知识点 1、数据库到Linux-数据库提权-Redis 3、数据库到Linux-数据库提权-PostgreSQL 4、计算机用户到系统-第三方软件-各类应用 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 Windows提权&#xff1a; 1、…