PyQuery

PyQuery是强大而又灵活的网页解析库,如果你觉得正则写起来太麻烦,如果你觉得BeautifulSoup语法太难记,如果你熟悉jQuery的语法
那么,PyQuery就是你绝佳的选择。

一、初始化方式,有三种,可以传入字符串,传入url,传入文件。
字符串初始化
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 pyquery import PyQuery as pq
doc = pq(html)#声明pq对象
print(doc('li'))#用css选择器来实现,如果要选id前面加#,如果选class,前面加.,如果选标签名,什么也不加

URL初始化
也可以直接传入URL,进行URL初始化,程序会自动请求URL,获得html并返回要查找的字符串
from pyquery import PyQuery as pq
doc = pq(url='http://www.baidu.com')#程序会自动请求url
print(doc('head'))#返回head标签

文件初始化
from pyquery import PyQuery as pq
doc = pq(filename='D://demo.html')#直接传入文件名称及路径,程序会自动寻找并请求
print(doc('li'))

二、基本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-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 pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))#会查找id为container class为list,标签为li的对象,只是层级关系,没有后者一定是前者的子对象

查找元素
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-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 pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')#拿到items
print(type(items))
print(items)
lis = items.find('li')#利用find方法,查找items里面的li标签,得到的lis也可以继续调用find方法往下查找,层层剥离
print(type(lis))
print(lis)

也可以用.children()查找直接子元素
lis = items.children()
print(type(lis))
print(lis)
lis = items.children('.active')
print(lis)

父元素
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-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 pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
container = items.parent()#.parent()查找对象的父元素
print(type(container))
print(container)

祖先节点
parents = items.parents()#.parents()祖先节点
parent = items.parents('.wrap')#当然也可以传入参数
print(parent)

兄弟元素
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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')#空格表示里面,没有空格表示整体
print(li.siblings())#.siblings()兄弟元素,即同级别的元素,不包括自己

三、遍历
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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
lis = doc('li').items()#.items会是一个生成器
print(type(lis))
for li in lis:
    print(li)

四、获取信息
获取属性
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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.attr('href'))#定义a标签的href属性用于指定超链接目标的URL。 如果用户选择了a标签中的内容,那么浏览器会尝试检索并显示href属性指定的URL所表示的文档,或者执行JavaScript表达式、方法和函数的列表。
print(a.attr.href)
结果:
<a href="link3.html"><span class="bold">third item</span></a>
link3.html
link3.html

获取文本
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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text)#.text()获取文本信息

获取html
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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print(li.html())#.html()获取所在html

五、DOM操作

addClass、removeClass
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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')#删除
print(li)
li.addClass('active')#增加
print(li)

attr、css
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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name', 'link')#增加一个属性
print(li)
li.css('font-size', '14px')#增加一个css
print(li)
结果:
< li class ="item-0 active" > < a href="link3.html" > < span class ="bold" > third item < / span > < / a > < / li >
< li class ="item-0 active" name="link" > < a href="link3.html" > < span class ="bold" > third item < / span > < / a > < / li >
< li class ="item-0 active" name="link" style="font-size: 14px" > < a href="link3.html" > < span class ="bold" > third item < / span > < / a > < / li >

remove
html = '''
<div class="wrap">
    Hello, World
    <p>This is a paragraph.</p>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print(wrap.text())
wrap.find('p').remove()#找到p标签然后删除
print(wrap.text())
结果:
Hello, World This is a paragraph.
Hello, World

其他DOM方法
http://pyquery.readthedocs.io/en/latest/api.html

六、伪类选择器
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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li:first-child')
print(li)
li = doc('li:last-child')
print(li)
li = doc('li:nth-child(2)')
print(li)
li = doc('li:gt(2)')
print(li)
li = doc('li:nth-child(2n)')
print(li)
li = doc('li:contains(second)')
print(li)
结果:
< li class ="item-0" > first item < / li >
< li class ="item-0" > < a href="link5.html" > fifth item < / a > < / li >
< li class ="item-1" > < a href="link2.html" > second item < / 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 >
< li class ="item-1" > < a href="link2.html" > second item < / a > < / li >
< li class ="item-1 active" > < a href="link4.html" > fourth item < / a > < / li >
< li class ="item-1" > < a href="link2.html" > second item < / a > < / li >

更多CSS选择器可以查看 http://www.w3school.com.cn/css/index.asp

官方文档
http://pyquery.readthedocs.io/
<think>好的,用户想了解如何使用PyQuery库,特别是它的使用方法和示例。我需要先回忆一下PyQuery的基本知识,确保自己正确无误。首先,PyQuery是一个类似于jQuery的Python库,用于解析和操作HTML文档。它可以让用户使用类似jQuery的语法来提取数据,这对于处理网页抓取非常方便。 用户提供的引用中有几个关键点需要整合。引用1和2都提到导入PyQuery的方式是`from pyquery import PyQuery as pq`,这是一个标准的导入方式。引用3指出PyQuery类似于jQuery和BeautifulSoup,这说明用户可能已经熟悉这些库,可以对比说明。引用4提到处理多个节点时需要遍历,以及获取属性的方法。引用5给出了一个具体的示例,包括发送请求、解析HTML和使用选择器。 接下来,我需要组织回答的结构,确保符合用户的要求:结构清晰,分步骤说明,提供示例代码,并引用相关段落。首先应该介绍如何安装和导入库,然后讲解如何初始化PyQuery对象,接着是选择器的使用,属性与文本的获取,处理多个节点,以及链式操作。最后给出一个完整的示例,并附上相关问题。 需要注意的是,用户可能对HTML解析不太熟悉,所以示例要尽量简洁明了。比如,在初始化对象时,可以演示从字符串和URL加载。选择器部分要说明CSS选择器的使用,比如类选择器、ID选择器等。在获取属性时,要区分attr()和text()方法的不同用途。处理多个节点时,使用items()方法遍历,并提醒用户注意多个元素时的处理方式。 还要注意代码格式的正确性,确保用户复制后可以运行。比如,示例中的URL可能需要处理反爬机制,但为了简单起见,先假设用户了解基本的请求处理,或者提醒他们可能需要添加headers等参数。 最后,生成的相关问题需要与PyQuery相关,可能涉及高级用法、性能比较、常见错误处理等,这有助于用户进一步探索。 现在检查是否有遗漏的步骤或错误。例如,初始化时除了字符串和URL,是否还可以从文件加载?虽然引用中没有提到,但PyQuery确实支持从文件读取,不过用户可能更常用的是网页内容,所以可以暂时省略。另外,链式操作可能需要更多例子,但现有示例已经足够说明问题。 确保所有引用都正确标注,比如初始化部分的引用1和2,处理多个节点的引用4,示例代码的引用5。最后生成的答案要自然,避免使用过多技术术语,保持口语化但准确。</think>### PyQuery 使用方法及示例 PyQuery 是一个基于 jQuery 语法的 Python 库,用于解析和操作 HTML/XML 文档。以下是具体使用方法: --- #### 1. **安装与导入** 首先安装 PyQuery 库: ```bash pip install pyquery ``` 导入库: ```python from pyquery import PyQuery as pq # 引用[1][2] ``` --- #### 2. **初始化 PyQuery 对象** 可以通过字符串、URL 或文件初始化: ```python # 从 HTML 字符串初始化 html = '<div class="content"><a href="https://example.com">Link</a></div>' doc = pq(html) # 从 URL 初始化(需配合 requests 库) import requests url = "https://book.douban.com/top250" response = requests.get(url) doc = pq(response.content) # 引用[5] ``` --- #### 3. **使用选择器定位元素** PyQuery 支持类似 jQuery 的 CSS 选择器语法: ```python # 选择 class 为 "content" 的 div 标签 div = doc('.content') # 选择 div 下的所有 a 标签 links = div('a') # 选择第一个匹配的元素 first_link = links.eq(0) ``` --- #### 4. **获取属性与文本** - **属性**:使用 `.attr('属性名')` ```python href = first_link.attr('href') # 输出:https://example.com ``` - **文本**:使用 `.text()` ```python text = first_link.text() # 输出:Link ``` --- #### 5. **遍历多个元素** 若选择结果包含多个节点,需遍历处理: ```python for link in links.items(): # 使用 items() 生成迭代器 引用[4] print(link.attr('href'), link.text()) ``` --- #### 6. **链式操作** 支持链式调用简化代码: ```python result = doc('ul').find('li').eq(1).text() ``` --- #### 完整示例:解析豆瓣图书榜单 ```python import requests from pyquery import PyQuery as pq url = "https://book.douban.com/top250" html = requests.get(url).content doc = pq(html) # 提取书名和链接 books = doc(".item a[title]") for book in books.items(): title = book.attr('title') link = book.attr('href') print(f"书名:{title}, 链接:{link}") # 引用[5] ``` --- ### 注意事项 - **动态页面**:PyQuery 仅解析静态 HTML,动态内容需配合 Selenium 等工具。 - **编码问题**:若网页编码非 UTF-8,需手动指定(如 `response.content.decode('gbk')`)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值