Python3编写网络爬虫07-基本解析库pyquery的使用
三、pyquery
简介:同样是一个强大的网页解析工具 它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便
安装:
pip install pyquery
验证:
import pyquery
初始化时 也需要传入HTML文本 初始化一个PyQuery对象 初始化方式有多种 例如直接传入字符串,传入URL,传入文件名等等。
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 #引入PyQuery对象 取别名pq
doc = pq(html)#将html当作参数 传递给PyQuery类
print(doc('li'))#传入li节点 选择所有li节点
2. URL初始化
doc = pq(url='https://www.huawei.com/cn/?',encoding='utf-8')
print(doc('title'))
pyquery对象首先请求url 得到HTML内容完成初始化 相当于用网页源代码 字符串的形式传递给pyquery类来初始化
与下面的功能是一样的
from pyquery import PyQuery as pq
import requests
doc = pq(requests.get('https://www.huawei.com').text)
print(doc('title'))
3.文件初始化
doc = pq(filename='01.txt')
print(doc('li'))
最常见的还是字符串形式
4.基本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节点
print(type(doc('#container .list li')))#pyquery类型
5.查找节点
# 常用的查询函数 与jQuery中函数用法完全相同
5.1 find() 方法 查找所有子孙节点
doc = pq(html)
items = doc('.list')
print(type(items))#pyquery类型
print(items)#ul节点内容
lis = items.find('li')#调用find()方法 参数必选
print(type(lis))#类型为pyquery
print(lis)#所有的li节点内容
5.2 children() 查找子节点
lis = items.children()#参数可选 例如 .active li等 进行元素过滤
print(type(lis))#类型为pyquery
print(lis)#子节点li
5.3 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>
''' from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)#返回id 为container的节点内容
5.4 parents() 获取某个节点的所有祖先节点
items = doc('.list')
parents = items.parents()
print(parents)#没有给参数 所以会遍历上一层级 传递css参数 可筛选
5.5 siblings() 获取所有兄弟节点
li = doc('.list .item-0.active')
print(li.siblings())#返回四个兄弟节点
#筛选的话 在方法中加入参数
print(li.siblings('.active'))#返回一个兄弟节点
6. 遍历
pyquery 选择结果可能是多个节点 也可能是单个节点 类型都是pyquery类型 没有返回向BS那样的列表
对于单个节点 可以直接打印输出 也可以转化成字符串
li = doc('.item-0.active')
print(li)
print(str(li))
多个节点 遍历 需要调用 items()方法
lis = doc('li').items()
print(type(lis))#结果是生成器
for li in lis:
print(li,type(li))
7. 获取信息
attr() 获取属性值
a = doc('.item-0.active a')
print(a,type(a))
print(a.attr('href'))#属性值为link3.html
简写 print(a.attr.href)
调用多个节点
a = doc('a')
print(a,type(a))
print(a.attr('href'))
print(a.attr.href)
#返回结果只有第一个
获取所有的a节点属性 遍历
a = doc('a')
for item in a.items():
print(item.attr.href)
text() 获取文本
a = doc('.item-0.active a')
print(a)
print(a.text())#首先选中a节点 text()方法 获取其内部文本信息 忽略掉节点内部包含的HTML 只返回纯文本内容
获取节点内部的HTML文本 html()方法
li = doc('.item-0.active')
print(li)#查找到第三个li节点
print(li.html())#a节点内容
选择到的是多个节点
li = doc('li')
print(li.html())#返回第一个节点的内部HTML文本
print(li.text())#返回所有的li节点内部纯文本
print(type(li.text()))#str 类型
8. 节点操作
pyquery提供了一系列方法对节点进行动态修改 例如给某个节点添加一个class 移除某个节点等
列举几个典型方法
8.1 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')#移除active属性
print(li)
li.addClass('active')#添加active属性
print(li)
8.2 attr()、text()、html()
li = doc('.item-0.active')
print(li)
li.attr('name','link')#修改属性 第一个参数为属性名
print(li)
li.text('changed item')#传入文本
print(li)
li.html('<span>changed item</span>')#传入html文本
print(li)
attr() 传入一个参数的属性名 获取这个属性值 传入两个参数 修改属性值
text() 获取节点内纯文本 传入参数进行赋值
html() 获取节点内部的HTML文本 传入参数进行赋值
8.3 remove() 移除
示例: 提取 Hello,World 文本
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()
print(wrap.text())
更多节点操作方法 http://pyquery.readthedocs.io/en/latest/api.html
9.伪类选择器
示例:
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')#第一个li节点
print(li) li = doc('li:last-child')#最后一个li节点
print(li) li = doc('li:nth-child(2)')#第二个li节点
print(li) li = doc('li:gt(2)')#第三个li之后的li节点
print(li) li = doc('li:nth-child(2n)')#偶数位置的li节点
print(li) li = doc('li:contains(second)')#包含second文本的li节点
print(li)
更多常用用法 参考官方文档 http://pyquery.readthedocs.io
Python3编写网络爬虫07-基本解析库pyquery的使用的更多相关文章
- Python3编写网络爬虫06-基本解析库Beautiful Soup的使用
二.Beautiful Soup 简介 就是python的一个HTML或XML的解析库 可以用它来很方便的从网页中提取数据 0.1 提供一些简单的 python式的函数来处理导航,搜索,修改分析树等功 ...
- Python3编写网络爬虫05-基本解析库XPath的使用
一.XPath 全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索 XPath 的选择功能十分强大,它提供了 ...
- Python3编写网络爬虫02-基本请求库requests的使用
一.requests 库使用 需要安装 pip install requests import requests #导入requests库 request = requests.get("h ...
- Python3编写网络爬虫01-基本请求库urllib的使用
安装python后 自带urllib库 模块篇 分为几个模块如下: 1. urllib.request 请求模块 2. urllib.parse 分析模块 3. urllib.error 异常处理模块 ...
- python3编写网络爬虫20-pyspider框架的使用
二.pyspider框架的使用 简介 pyspider是由国人binux 编写的强大的网络爬虫系统 github地址 : https://github.com/binux/pyspider 官方文档 ...
- python3编写网络爬虫21-scrapy框架的使用
一.scrapy框架的使用 前面我们讲了pyspider 它可以快速的完成爬虫的编写 不过pyspider也有一些缺点 例如可配置化不高 异常处理能力有限对于一些反爬虫程度非常强的网站 爬取显得力不从 ...
- Python3编写网络爬虫08-数据存储方式一-文件存储
数据存储 用解析器解析出数据之后,就是存储数据了.保存的形式可以多种多样,最简单的形式是直接保存为文本文件,如TXT JSON CSV等.另外还可以保存到数据库中,如关系型数据库MySQL 非关系型数 ...
- Python3编写网络爬虫04-爬取猫眼电影排行实例
利用requests库和正则表达式 抓取猫眼电影TOP100 (requests比urllib使用更方便,由于没有学习HTML系统解析库 选用re) 1.目标 抓取电影名称 时间 评分 图片等 url ...
- python3编写网络爬虫18-代理池的维护
一.代理池的维护 上面我们利用代理可以解决目标网站封IP的问题 在网上有大量公开的免费代理 或者我们也可以购买付费的代理IP但是无论是免费的还是付费的,都不能保证都是可用的 因为可能此IP被其他人使用 ...
随机推荐
- rhel 配置centos源
1.删除自带的yum包,清除/etc/yum.repos.d下面的文件 rpm -qa|grep yum|xargs rpm -e --nodeps(不检查依赖,直接删除rpm包) 2.安装cento ...
- php持续推送信息到客户端的方法
<?php set_time_limit(0); $i=1; while($i++) { echo $i,'<br />'; ob_flush();//冲刷出(送出)输出缓冲区中的内 ...
- vi常用命令总结
1. 打开文件 > vi 文件 //该模式是命令模式 2. 尾行模式操作 > :q //该模式是“尾行模式” > :w //保存已经修改的文档 > :wq //保存并退出 &g ...
- spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
前言 开心一刻 小白问小明:“你前面有一个5米深的坑,里面没有水,如果你跳进去后该怎样出来了?”小明:“躺着出来呗,还能怎么出来?”小白:“为什么躺着出来?”小明:“5米深的坑,还没有水,跳下去不死就 ...
- JavaWeb学习 (三)————Tomcat服务器学习和使用(二)
一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- 图像处理中kmeans聚类算法C++实现
Kmeans聚类算法是十分常用的聚类算法,给定聚类的数目N,Kmeans会自动在样本数据中寻找N个质心,从而将样本数据分为N个类别.下面简要介绍Kmeans聚类原理,并附上自己写的Kmeans聚类算法 ...
- Ubuntu安装与配置
四.ubuntu下生成ngrok服务器主程序 4.1.步骤与先决条件 如果你只是临时穿透或调试用,到第三步基本就可以了,但如果想作为稳定的商业服务,用别人的服务器还是受制于人,这里我们准备搭建自己的n ...
- 在EF中执行SQL语句(转载)
在EF中执行SQL语句 你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除 ...
- Hive数据倾斜
数据倾斜是进行大数据计算时最经常遇到的问题之一.当我们在执行HiveQL或者运行MapReduce作业时候,如果遇到一直卡在map100%,reduce99%一般就是遇到了数据倾斜的问题.数据倾斜其实 ...
- 试议常用Javascript 类库中 throttle 与 debounce 辅助函数的区别
问题的引出 看过我前面两篇博客的童鞋可能会注意到都谈到了事件处理的优化问题. 在很多应用中,我们需要控制函数执行的频率, 例如 窗口的 resize,窗口的 scroll 等操作,事件触发的频率非常高 ...