ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python3爬虫(7)--使用pyquery的CSS选择器(Selectors)解析数据

2020-01-24 13:44:33  阅读:803  来源: 互联网

标签:pyquery doc class html Selectors href 节点 td 选择器


在利用python进行就网页数据采集时,为们往往通过urllibrequests发送请求,返回的数据结构是json格式的,我们就使用json解析;其他格式的网页数据可以采用XPath(lxml)解析数据或者使用Beautiful Soup解析数据或者使用pyquery解析数据等很多方法。其中,pyquery同样是一个强大的网页解析工具,它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便。

目录

1、准备及初始化

2、使用pyquery的CSS选择器(Selectors)基本使用

3、伪类选择器

4、遍历、获取信息(属性、文本)

5、子(孙)节点,父(祖)节点查找、兄弟节点的查找

6、节点操作


1、准备及初始化

# pip install pyquery #安装
from pyquery import PyQuery as pq #引入
import requests
html = '''
    <div>
        <p class="pidg" id="name">nba</p>
        <td class="nobr player desktop">
            <a href="bucks" class="ng-binding" target="_parent" 
            href1="/teams/#!/bucks"><!-- ngIf: row.clinched -->密尔沃基&nbsp;雄鹿<b>nba</b></a>
        </td>
        <tr data-ng-repeat="(i, row) in page" index="0" class="ng-scope">
            <td class="nobr center bold ng-binding_0" href="href01">6</td>
            <td class="nobr center bold desktop ng-binding">18&nbsp;-&nbsp;4</td>
            <td class="nobr center bold desktop ng-binding">胜 6</td>
            <td class="nobr center bold desktop ng-binding">119.5</td>
        </tr>
    </div>
    '''
'''*************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   选择所有的<p>和<a>元素:doc('p,a')
elment element  div p     选择所有的div元素下所有的<p>元素:doc('div p')  #中间用空格
elment>element    div>td     选择父元素为<div>元素的所有<td>元素:doc('div>td')
elment+element p+td   选择紧接在<p>元素之后的所有<td>元素:doc('p+td') #同级
element~element td~td

选择前面有<td>元素的每个<td>元素:doc('td~td').text() #18 - 4 胜 6 119.5

理解:前面一个<td>元素的text() 是6,没有输出哦!!!

[attribute]   [href]  选择带有href属性的所有元素:doc("[href]")
[attribute=value] [href=bucks]  选择href=bucks的所有元素:doc("[href=bucks]") /doc('[href="bucks"]')
[attribute=value] a[href="bucks"] 选择<a>元素属性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"开头的每个<a>元素:doc('a[href ^= bu]')
[attribute$=value] a[href $=cks]  选择href属性值以"bu"结尾的每个<a>元素: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() #<!-- ngIf: row.clinched -->密尔沃基 雄鹿<b>nba</b>

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有