Python 爬虫(五):PyQuery 框架
时间:2022-07-23
本文章向大家介绍Python 爬虫(五):PyQuery 框架,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
PyQuery 是仿照 jQuery 实现的,语法与 jQuery 几乎完全相同,如果你熟悉 jQuery,又不想再记一套 BeautifulSoup (Python 爬虫(三):BeautifulSoup 库) 的调用方法,那么 PyQuery 是一个很好的选择。
1 准备工作
1.1 安装
使用如下终端命令安装
pip install pyquery
安装完成后导包
from pyquery import PyQuery as pq
1.2 初始化
传入字符串
from pyquery import PyQuery as pq
html = '''
<html>
<head>
<title>Hello PyQuery</title>
</head>
<body>
<ul id="container">
<li class="l1">l1</li>
<li class="l2">l2</li>
<li class="l3">l3</li>
</ul>
</body>
</html>
'''
doc = pq(html)
print(type(doc))
print(doc)
传入文件
from pyquery import PyQuery as pq
doc= pq(filename='p.html')
print(type(doc))
print(doc)
传入 lxml.etree
from pyquery import PyQuery as pq
from lxml import etree
doc = pq(etree.fromstring('<html><title>Hello PyQuery</title></html>'))
print(type(doc))
print(doc)
传入 URL
from pyquery import PyQuery as pq
doc = pq('http://www.baidu.com')
print(type(doc))
print(doc)
2 快速上手
2.1 基本使用
获取元素
首先,我们使用 PyQuery 的 CSS 选择器获取指定元素。示例如下:
from pyquery import PyQuery as pq
html = '''
<html>
<head>
<title>Hello PyQuery</title>
</head>
<body>
<ul id="container">
<li class="l1">l1</li>
<li class="l2">l2</li>
<li class="l3">l3</li>
</ul>
</body>
</html>
'''
doc = pq(html)
# 获取 ul
ul = doc('#container')
# 获取 li
li = doc('ul li')
print(ul)
print(li)
遍历元素
from pyquery import PyQuery as pq
html = '''
<html>
<head>
<title>Hello PyQuery</title>
</head>
<body>
<ul id="container">
<li class="l1">l1</li>
<li class="l2">l2</li>
<li class="l3">l3</li>
</ul>
</body>
</html>
'''
doc = pq(html)
# 遍历 li
lis =doc('li').items()
for li in lis:
print(li)
存在多个相同元素时,获取指定元素
from pyquery import PyQuery as pq
html = '''
<html>
<head>
<title>Hello PyQuery</title>
</head>
<body>
<ul id="container">
<li class="l1">l1</li>
<li class="l2">l2</li>
<li class="l3">l3</li>
</ul>
</body>
</html>
'''
doc = pq(html)
lis =doc('li').items()
# 获取第二个 li
l2 = list(lis)[1]
print(l2)
获取父、子、兄弟元素
PyQuery 可以通过方法直接获取指定元素的父、子、兄弟元素。示例如下:
from pyquery import PyQuery as pq
html = '''
<html>
<head>
<title>Hello PyQuery</title>
</head>
<body>
<ul></ul>
<ul id="container">
<li class="l1">l1</li>
<li class="l2">l2</li>
<li class="l3">l3</li>
</ul>
<ul></ul>
</body>
</html>
'''
doc = pq(html)
ul = doc('#container')
l2 = doc('#container .l2')
# 获取 ul 父元素
ul_parent = ul.parent()
# 获取 ul 子元素
ul_child = ul.children()
# 获取第二个 li 兄弟元素
l2_sib = l2.siblings()
print(ul_parent)
print(ul_child)
print(l2_sib)
获取属性、文本信息
from pyquery import PyQuery as pq
html = '''
<html>
<head>
<title name='title'>Hello PyQuery</title>
</head>
</html>
'''
doc = pq(html)
title =doc('title')
# 获取 name 属性
print(title.attr('name'))
# 获取 title 标签文本信息
print(title.text())
获取 html
from pyquery import PyQuery as pq
html = '''
<html>
<head>
<title>Hello PyQuery</title>
</head>
<body>
<ul id="container">
<li class="l1">l1</li>
<li class="l2">l2</li>
<li class="l3">l3</li>
</ul>
</body>
</html>
'''
doc = pq(html)
# 获取 ul 中 html
ul =doc('ul')
print(ul.html())
2.2 伪类选择器
伪类可以根据一个元素的特征进行分类,下面通过示例了解下伪类选择器的使用。
from pyquery import PyQuery as pq
html = '''
<html>
<head>
<title>Hello PyQuery</title>
</head>
<body>
<ul id="container">
<li class="l1">l1</li>
<li class="l2">l2</li>
<li class="l3">l3last</li>
</ul>
</body>
</html>
'''
doc = pq(html)
# 设置起始位置
lis = doc('li:gt(-1)')
# 获取第一个 li
fli = doc('li:first-child')
# 获取最后一个 li
lli = doc('li:last-child')
# 获取指定 li
l2 = doc('li:nth-child(2)')
# 获取包含 last 的 li
cli = doc('li:contains("last")')
print(lis)
print(fli)
print(lli)
print(l2)
print(cli)
参考:
https://pythonhosted.org/pyquery/api.html
- Spring boot with Service
- Spring boot with PostgreSQL
- Struts2 S2-046, S2-045 Firewall(漏洞防火墙)
- 应用程序的通信成本
- Spring cloud 之 Feign Client
- Spring Cloud Netflix
- 重新整理AUTO_INCREMENT字段
- Spring Cloud Config
- Spring boot with Schedule (启用/禁用)
- DevOps Tools
- Docker 虚拟机之 Redis
- Spring boot with HTTPS SSL
- Spring boot with Git version
- Spring boot with Elasticsearch 5.5.1
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 小白学PyTorch | 18 TF2构建自定义模型
- 扩展之Tensorflow2.0 | 19 TF2模型的存储与载入
- 扩展之Tensorflow2.0 | 20 TF2的eager模式与求导
- Django JSONField SQL注入漏洞(CVE-2019-14234)分析与影响
- 扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积、激活、初始化、正则
- 持续代码质量管理-SonarQube-7.3部署
- 攻击Scrapyd爬虫
- 【webpack】从vue-cli 2x 到 3x 迁移与实践
- 前端单元测试那些事
- 前端Nginx那些事
- 前端运维部署那些事
- 《前端那些事》从0到1开发简单脚手架
- CDH7.1.1启用Kerberos
- 持续代码质量管理-SonarQube Scanner部署 2.1. 软件安装2.2. 配置修改
- 《前端那些事》聊聊前端的按需加载