10.5 PyQuery:jQuery 风格的 Python HTML 解析库


文章目录

  • 前言
  • 一、准备工作
    • [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 支持多种数据源初始化:

  1. 传入 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)
  1. 传入本地文件
python 复制代码
python
doc = pq(filename='p.html')
  1. 传入 lxml.etree 对象
python 复制代码
python
from lxml import etree

etree_obj = etree.fromstring('<html><title>Hello PyQuery</title></html>')
doc = pq(etree_obj)
  1. 传入 URL(自动请求)
python 复制代码
python
doc = pq('http://www.baidu.com')

二、 快速上手

2.1 基础操作

  1. 获取元素
python 复制代码
python
doc = pq(html)

# 通过ID选择器获取元素
ul = doc('#container')

# 通过层级选择器获取元素
li = doc('ul li')

print(ul)  # 输出ul元素
print(li)  # 输出所有li元素
  1. 遍历元素
python 复制代码
python
# 获取所有li元素的迭代器
lis = doc('li').items()

for li in lis:
    print(li)
  1. 获取指定位置元素
python 复制代码
python
lis = doc('li').items()
l2 = list(lis)[1]  # 获取第二个li元素(索引从0开始)
print(l2)
  1. 获取亲属元素
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)
  1. 获取属性与文本
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
  1. 获取 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开始)

相关推荐
ValhallaCoder33 分钟前
hot100-二叉树I
数据结构·python·算法·二叉树
猫头虎1 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
八零后琐话2 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
青春不朽5123 小时前
Scrapy框架入门指南
python·scrapy
MZ_ZXD0013 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
全栈老石4 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python
梨落秋霜4 小时前
Python入门篇【模块/包】
python
阔皮大师5 小时前
INote轻量文本编辑器
java·javascript·python·c#
小法师爱分享5 小时前
StickyNotes,简单便签超实用
java·python