文章目录
- 前言
- 一、准备工作
-
- [1.1 安装](#1.1 安装)
- [1.2 初始化方式](#1.2 初始化方式)
- [二、 快速上手](#二、 快速上手)
-
- [2.1 基础操作](#2.1 基础操作)
- [2.2 伪类选择器](#2.2 伪类选择器)
- [2.3 常用选择器速查表](#2.3 常用选择器速查表)
前言
PyQuery 是一款基于 Python 的 HTML 解析库,其设计完全借鉴了 jQuery 的 API 风格。如果你熟悉 jQuery 的操作语法,又希望避免学习 BeautifulSoup 等其他解析库的全新方法体系,PyQuery 将是你的理想选择。
一、准备工作
1.1 安装
bash
bash
pip install pyquery
导入模块(推荐使用别名 pq):
python
python
from pyquery import PyQuery as pq
1.2 初始化方式
PyQuery 支持多种数据源初始化:
- 传入 HTML 字符串
python
python
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)
- 传入本地文件
python
python
doc = pq(filename='p.html')
- 传入 lxml.etree 对象
python
python
from lxml import etree
etree_obj = etree.fromstring('<html><title>Hello PyQuery</title></html>')
doc = pq(etree_obj)
- 传入 URL(自动请求)
python
python
doc = pq('http://www.baidu.com')
二、 快速上手
2.1 基础操作
- 获取元素
python
python
doc = pq(html)
# 通过ID选择器获取元素
ul = doc('#container')
# 通过层级选择器获取元素
li = doc('ul li')
print(ul) # 输出ul元素
print(li) # 输出所有li元素
- 遍历元素
python
python
# 获取所有li元素的迭代器
lis = doc('li').items()
for li in lis:
print(li)
- 获取指定位置元素
python
python
lis = doc('li').items()
l2 = list(lis)[1] # 获取第二个li元素(索引从0开始)
print(l2)
- 获取亲属元素
python
python
ul = doc('#container')
l2 = doc('#container .l2')
# 获取父元素
ul_parent = ul.parent()
# 获取所有子元素
ul_child = ul.children()
# 获取兄弟元素(除自身外的同级元素)
l2_sib = l2.siblings()
print(ul_parent)
print(ul_child)
print(l2_sib)
- 获取属性与文本
python
python
doc = pq('''
<html>
<head>
<title name='title'>Hello PyQuery</title>
</head>
</html>
''')
title = doc('title')
# 获取属性
print(title.attr('name')) # 输出:title
# 获取文本内容
print(title.text()) # 输出:Hello PyQuery
- 获取 HTML 内容
python
python
ul = doc('ul')
print(ul.html()) # 输出ul内部的HTML
2.2 伪类选择器
伪类选择器允许根据元素特征进行更精细的筛选:
python
python
doc = pq('''
<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>
''')
# :gt() - 获取索引大于指定值的元素
lis = doc('li:gt(-1)') # 获取所有li(索引大于-1)
# :first-child - 获取第一个子元素
fli = doc('li:first-child')
# :last-child - 获取最后一个子元素
lli = doc('li:last-child')
# :nth-child() - 获取指定位置的子元素
l2 = doc('li:nth-child(2)') # 第二个li
# :contains() - 获取包含指定文本的元素
cli = doc('li:contains("last")') # 包含"last"文本的li
print(lis)
print(fli)
print(lli)
print(l2)
print(cli)
2.3 常用选择器速查表
| 选择器类型 | 示例 | 说明 |
|---|---|---|
| 基础选择器 | doc('li') | 标签选择器 |
| doc('.l1') | 类选择器 | |
| doc('#container') | ID选择器 | |
| 层级选择器 | doc('ul li') | 后代元素 |
| doc('ul > li') | 直接子元素 | |
| 属性选择器 | doc('[class]') | 有class属性的元素 |
| doc('[class="l1"]') | class等于l1的元素 | |
| 伪类选择器 | doc('li:first') | 第一个li |
| doc('li:last') | 最后一个li | |
| doc('li:even') | 偶数索引的li | |
| doc('li:odd') | 奇数索引的li | |
| doc('li:eq(1)') | 第二个li(索引0开始) |