前言:

在利用python进行就网页数据采集时,我们往往通过urllib或requests发送请求,返回的数据结构是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 -->密尔沃基 雄鹿<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 - 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.ge
# 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]

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、子(孙)节点,父(祖)节点查找、兄弟节点的查找

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)

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: CSSpython