在利用python进行就网页数据采集时,为们往往通过urllib或requests发送请求,返回的数据结构是json格式的,我们就使用json解析;其他格式的网页数据可以采用XPath(lxml)解析数据或者使用Beautiful Soup解析数据或者使用pyquery解析数据等很多方法。其中,pyquery同样是一个强大的网页解析工具,它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便。
目录
1、准备及初始化
2、使用pyquery的CSS选择器(Selectors)基本使用
3、伪类选择器
4、遍历、获取信息(属性、文本)
5、子(孙)节点,父(祖)节点查找、兄弟节点的查找
6、节点操作
# pip install pyquery #安装
from pyquery import PyQuery as pq #引入
import requests
html = '''
'''
'''*************1、初始化***********************'''
doc=pq(html)# 初始化:它的初始化方式有多种,比如直接传入字符串,传入URL,传人文件名,等等。
# doc=pq(requests.get('https://blog.csdn.net/weixin_41685388/category_9426224.html').text)
# doc=doc=pq(filename='demo.html')
CSS选择器 | 简易实例 | 说明[doc=pq(html) #html来自第1点:准备及初始化] | |
---|---|---|---|
* | * | 选择所有的元素:doc('*') | |
element | p | 选择所有的 元素:doc('p') |
|
.class | .pidg | 选择所有class='pidg' 的元素:doc('.pidg') | |
.class | p.pidg | 选择 class='pidg'的<p>标签:doc('p.pidg') | |
#id | #name | 选择所有id="name"的元素:doc('#name') | |
#id | a#name | 选择 id= 'name' 的<p>标签:doc('p#name') | |
element,element | p,a | 选择所有的 | |
elment element | div p | 选择所有的div元素下所有的 元素:doc('div p') #中间用空格 |
|
elment>element | div>td | 选择父元素为 元素的所有 元素:doc('div>td') |
|
elment+element | p+td | 选择紧接在 元素之后的所有 | 元素:doc('p+td') #同级 |
element~element | td~td | 选择前面有<td>元素的每个<td>元素:doc('td~td').text() #18 - 4 胜 6 119.5 理解:前面一个 | 元素的text() 是6,没有输出哦!!! |
[attribute] | [href] | 选择带有href属性的所有元素:doc("[href]") | |
[attribute=value] | [href=bucks] | 选择href=bucks的所有元素:doc("[href=bucks]") /doc('[href="bucks"]') | |
[attribute=value] | a[href="bucks"] | 选择元素属性href="bucks"的元素:doc('a[href="bucks"]') | |
[attribute=value | [class="nobr player desktop"] | 选择class="nobr player desktop"的所有元素: doc('[class *="nobr player desktop"]') |
|
[attribute~=value] | [class~=desktop] | 选择class属性包含字符串desktop的所有元素:doc("[class~=desktop]") | |
[attribute|=value] | [href |= bucks] | 选择href属性值以"bucks"开头的所以元素:doc('[href |= bucks]') #调试不稳定 | |
[attribute^=value] | a[href ^= bu] | 选择href属性值以"bu"开头的每个元素:doc('a[href ^= bu]') | |
[attribute$=value] | a[href $=cks] | 选择href属性值以"bu"结尾的每个元素:doc('a[href $=cks]') | |
[attribute*=value] | [class*=desktop] | 选择class属性包含字符串desktop的所有元素:doc("[class*=desktop]") |
CSS选择器支持多种伪类选择器,如选择第一个节点、最后一个节点、第n个节点、包含指定文本的节点等。
方法 | 说明 | 案例[doc=pq(html) #html来自第1点:准备及初始化] |
---|---|---|
:first-child | 获取第一个节点 | doc("tr>td:first-child") |
:last-child | 获取最后一个节点 | doc("tr>td:last-child") |
:nth-child(N) | 获取第N个节点,N=1,2,... | doc("tr>td:nth-child(2)") |
:nth-child(2n) | 获取偶数位置的全部节点 | doc("tr>td:nth-child(2n)") |
:nth-child(2n-1) | 获取奇数位置的全部节点 | doc("tr>td:nth-child(2n-1)") |
:gt(N) | 获取索引大于N的节点,N=0,1,... | doc("tr>td:gt(1)") |
:contains('雄鹿') | 获取文本包含"雄鹿"的节点 | doc("td:contains('雄鹿')") |
方法 | 说明 | 案例[doc=pq(html) #html来自第1点:准备及初始化] |
---|---|---|
.items() | 遍历多节点 | for td in doc('tr>td').items(): print(td) |
.attr() | 获取属性 | doc("a").attr("href") |
.attr. | 获取属性 | doc("a").attr.href |
.text() | 获取文本 | doc("a").text() #密尔沃基 雄鹿nba |
.html() | 获取节点内部的HTML文本 | doc("a").html() #密尔沃基 雄鹿nba |
方法 | 说明 | 案例[doc=pq(html) #html来自第1点:准备及初始化] |
---|---|---|
.find() | 查找符合条件的所有子孙节点 | doc('div').find('td') |
.children() | 查找直接子节点 | doc('td[class="nobr player desktop"]').children() |
.children() | 查找符合条件的直接子节点 | doc('td[class="nobr player desktop"]').children('a[href="bucks"]') |
.parent() | 查找直接父节点 | doc('a[href="bucks"]').parent() |
.parent() | 查找符合条件的父节点 | doc('a[href="bucks"]').parent('td[class="nobr player desktop"]') |
.parents() | 查找祖先节点 | doc('a[href="bucks"]').parents() |
.parents() | 查找符合条件的祖先节点 | doc('a[href="bucks"]').parents('td[class="nobr player desktop"]') |
.siblings() | 查找全部兄弟标签 | doc('td[href="href01"]').siblings() |
.siblings() | 查找符合条件的兄弟标签 | doc('td[href="href01"]').siblings('td[class *= "nobr"]') |
为了提取方便,我们可以修改我们已经获取的html的节点,如在指定位置添加class,移除不需要的某个(些)节点等。
方法 | 说明 | 案例[doc=pq(html) #html来自第1点:准备及初始化] |
---|---|---|
removeClass() | 移除class属性 | r=doc("tr>td").removeClass("center") 或者r=doc("tr>td").remove_class("center") |
addClass() | 添加class属性 | r=doc("tr>td").addClass("nba") r=doc("tr>td").add_class("nba") |
attr() | 添加属性a,值为nba | r=doc("tr>td").attr("a","nba") |
text() | 修改节点内文本为nba | r=doc("td>a").text("nba") |
html() | 修改节点内文本为nba | r=doc("td>a").html("nba") |
remove() | 移除指定节点 | doc("tr").remove() print(doc) |