在利用python进行就网页数据采集时,为们往往通过urllib或requests发送请求,返回的数据结构是json格式的,我们就使用json解析;其他格式的网页数据可以采用XPath(lxml)解析数据或者使用Beautiful Soup解析数据或者使用pyquery解析数据等很多方法。其中,pyquery同样是一个强大的网页解析工具,它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便。
目录
1、准备及初始化
# pip install pyquery #安装
from pyquery import PyQuery as pq #引入
import requests
html = '''
nba
href1="/teams/#!/bucks">密尔沃基 雄鹿nba
618 - 4胜 6119.5'''
'''*************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')
2、使用pyquery的CSS选择器(Selectors)基本使用
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
选择所有的
和元素:doc('p,a')
elment element
div p
选择所有的div元素下所有的
元素:doc('div p') #中间用空格
elment>element
div>td
选择父元素为
elment+element
p+td
选择紧接在
元素之后的所有
元素:doc('p+td') #同级element~element
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]")
3、伪类选择器
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('雄鹿')")
4、遍历、获取信息(属性、文本)
方法
说明
案例[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
5、子(孙)节点,父(祖)节点查找、兄弟节点的查找
方法
说明
案例[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"]')
6、节点操作
为了提取方便,我们可以修改我们已经获取的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)
Jalen data analysis
发布了109 篇原创文章 · 获赞 108 · 访问量 1万+
私信
关注
标签:pyquery,doc,class,html,Selectors,href,节点,td,选择器
来源: https://blog.csdn.net/weixin_41685388/article/details/104076625