首页 > 编程语言 >Python爬虫-Pyquery的用法(四)

Python爬虫-Pyquery的用法(四)

时间:2022-09-03 17:55:22浏览次数:96  
标签:Pyquery Python doc 爬虫 li item print PyQuery 节点

一、 PyQuery介绍与安装

1、PyQuery简介

PyQuery简介

  • PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择。
    • 官网地址:http://pyquery.readthedocs.io/en/latest/
    • jQuery参考文档:可以用来查找选择器

2、PyQuery的安装

pip install lxml #pyquery依赖于lxml解析库
pip install pyquery

二、 PyQuery的使用

1、初始化工作(会自动补齐不完整html标签)

在解析 HTML 文本的时候,首先需要将其初始化为一个 pyquery 对象。PyQuery的初始化方式有多种:传入字符串、 URL、文件名,等等。

1.1、 字符串初始化
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)
print(doc('li'))
1.2、URL 初始化(初始化的参数还可以传入网页的 URL,此时只需要指定参数为 url 即可)
from pyquery import PyQuery as pq
doc = pq(url='http://www.baidu.com',encoding="utf-8")
print(doc('title'))

1.3、注意:初始化URL时推荐先使用爬虫库(urllib、resquests)封装URL后再传递给pyquery(爬取数据和解析数据分开):  

from pyquery import PyQuery as pq
import requests

res = requests.get('http://www.baidu.com')
res.encoding="utf-8"
doc = pq(res.text)
print(doc('title'))
1.4、文件初始化(传递一个本地的文件名,参数指定为 filename 即可)

demo.html文件示例:

<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
         <li id="item-0"><a rel="nofollow" href="link2.html">second item</a></li>
         <li class="item-0 active"><a rel="nofollow" href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a rel="nofollow" href="link4.html">fourth item</a></li>
         <li class="shop"><a rel="nofollow" href="link5.html">fifth item</a></li>
         <a rel="nofollow" href="link5.html">te xxx</a>
         <p>tet1</p>
         <p>tet2</p>
         <p>tet3</p>
     </ul>
     <div>test0001</div>
 </div>

  

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

2、查找节点

2.1、直接查找节点名

语法:doc("节点名")——通过CSS选择器来获取目标内容(满足CSS语法)。

# 选取class为list的节点
items = doc('.list')

#关联选择符的使用
print(doc("ul li.shop a")) 
2.2、使用函数查找嵌套元素(等价于:doc(""),嵌套元素用空格隔开)
  • 语法:doc("节点名").find("节点名")
  • 注意:find 的查找范围是节点的所有子孙节点,而如果我们只想查找子节点,那可以用 children 方法。
#查找 <ul> 内部的 a 元素
print(doc('ul').find('a')) 
print(doc("ul a"))

#查找 <ul> 内的直接子 a 子标签
print(doc('ul').children('a')) 
print(doc("ul > a"))
2.3、根据 class、id 筛选指定元素。
  • 语法:doc("节点名").filter()
#查找 class 为 item-1 的 li 元素()
print(doc('li').filter('.item-1'))
print(doc("li.item-1"))

#查找 id 为 item-0 的 li元素
print(doc('li').filter('#item-0'))
print(doc("li#item-0")

3、遍历

pyquery的选择结果可能是单个节点(可以直接打印输出,也可以直接转成字符串);
也可能是多个节点,类型都是PyQuery类型,多个结果时所以需要遍历来获取。
这时候需要调用 items() 方法;调用 items 方法后,会得到一个生成器,遍历一下,就可以逐个得到 单节点对象了。
语法:doc("节点名").items()

lis = doc('li').items()
for li in lis:
    print(li)

4、获取信息、修改信息

提取到节点之后,我们的最终目的当然是提取节点所包含的信息了。比较重要的信息有两类,一是获取属性,二是获取文本。

4.1、获取、修改文本信息
语法:

doc("节点名").html()——用html()获取HTML文本;
doc("节点名").text()——用text()来获取文本(只返回纯文字内容)。

print(doc('a').text())	#返回所有a标签文本内容
print(doc('a').text("阿里"))	#会将所有a标签内容修改为“阿里”

5、获取祖先节点、子孙节点:

#获取祖先节点
# 子节点
items = doc('.list')
lis = items.children()
print(lis)

# class为active的子节点
lis = items.children('.active')
print(lis)

# 父节点
lis = items.parent()
print(lis)

# 祖先节点,如果需要筛选,也可以传入CSS选择器
container = items.parents()
print(container)

# 兄弟节点
lis1 =items.siblings()
print(lis1)

6、节点操作

pyquery 提供了一系列方法来对节点进行动态修改,比如为某个节点添加一个 class,移除某个节点等,这些操作有时会为提取信息带来极大的便利。

li = doc('item-0.active')
#获取元素属性的值
li.attr('href')
# 删除class属性
li.removeClass('active')
# 添加class属性
li.addClass('active')
# 改变属性
li.attr('name', 'link')
# 改变文本内容
li.text(str)
# 改变html
li.html(html)
# 移除指定节点
li.remove()
li.find("a").remove()	#移除子节点a标签

7、伪类选择器

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

  

  

  

  

  

  

  

  

  

  

标签:Pyquery,Python,doc,爬虫,li,item,print,PyQuery,节点
From: https://www.cnblogs.com/xfbk/p/16649447.html

相关文章

  • 学习 python进阶 限制子类必须实现方法
          方法二 ......
  • 学习 python进阶 Mixin机制,派生和组合
          派生和組合    组合   ......
  • python数据类型
    序列类型str字符型list列表tuple元组列表与元组最大的区别就是列表可变,而元组不可变遍历从头到尾,依次访问到每一个range()包头不包尾range(start,end,step)......
  • Python tkinter 制作一个经典的登录界面和点击事件
    前言Tkinter(即tkinterface)是Python标准GUI库,简称“Tk”;从本质上来说,它是对TCL/TK工具包的一种Python接口封装。Tkinter是Python自带的标准库,因此无须另......
  • 献芹奏曝-Python面试题-算法-链表篇
    上一篇:献芹奏曝-Python面试题    开篇的话:本文目的是收集和归纳力扣上的算法题,希望用python语言,竭我所能做到思路最清奇、代码最简洁、方法最广泛、性能最高效,了解......
  • 【Python】路径相关
    Python自带os.path库相关函数一、判断文件/路径是否存在os.path.isfile()os.path.isdir()os.path.exists()返回值:True/False二、创建文件夹os.makedirs()impor......
  • ubuntu 多版本python并存
    在安装了最新的ubuntu22.04后,自带的python版本为python3.10,然而我需要的一个package仅支持到python3.7。因此,我需要安装python3.7。1、安装python3.7sudoaptupdatesu......
  • 第二节:编程语言与Python介绍
    一引子基于上一节所学,有了计算机硬件,再在硬件之上安装好操作系统,我们就有了一个应用程序的运行平台,我们接下来的任务就是学习如何使用某款编程语言来开发应用程序。 ......
  • Python 博客园快速备份脚本
    鉴于有些小伙伴在寻找博客园迁移到个人博客的方案,本人针对博客园实现了一个自动备份脚本,可以快速将博客园中自己的文章备份成Markdown格式的独立文件,备份后的md文件可以直......
  • [AWS] Lambda Python Get Current Account Id
    UnlikeAWS_REGIONorAWS_LAMBDA_FUNCTION_NAME,wecannotgetcurrentaccountidfromtheenvironmentvariables.Inordertotogettheaccountid,wecanuse......