Python3 【解析库pyquery】

一.介绍pyquery

  上面介绍了Beautiful Soup的使用方法,会发现CSS选择器并没有那么强大,接下来

学习pyquery弥补了CSS选择器的

安装:

pip install pyquery

二.基本使用

html ='''
<!DOCTYPE html>
<html>
<head>
    <title>故事</title>
</head>
<body>
   <p class="title" name="dromouse"><b>这个是dromouse</b></p>
   <p class="story">Once upon a time there were three little sister;
       and their names were
       <a href="http://www.baidu.com" class="sister" id="link1"><!--GH--></a>
       <a href="http://www.baidu.com/oracle" class="sister" id="link2">Local</a>and
       <a href="http://www.baidu.com/title" class="sister" id="link3">Tillie</a>;
   and they lived at the bottom of a well.</p>
   <p class="story">...</p>

</body>
</html>

'''

from pyquery import PyQuery as pq

#将对象pq传入参数进行初识化
doc = pq(html)

#输出所有p标签内容
print(doc('p'))

可以直接传入URL

from pyquery import PyQuery as pq

#将对象pq传入参数进行初识化
doc = pq(url="https://www.baidu.com")

print(doc('title'))

请求文件也可以

import requests

from pyquery import PyQuery as pq

url = "https://www.baidu.com"
#将对象pq传入参数进行初识化
doc = pq(requests.get(url).text)

print(doc('title'))

文件初始化

from pyquery import PyQuery as pq

#将对象pq传入参数进行初识化
doc = pq(filename="demo.html")

print(doc('title'))

三.基本CSS选择器

  1.基本使用

from pyquery import PyQuery as pq

doc = pq(url="https://www.baidu.com")

div = doc('.card .lazyload ')

print(div)

 2.查找节点

   介绍一下查询函数,这些函数和jQuery中函数的用法完全相同

1.子节点

         find()方法查找的是所有的子孙节点

from pyquery import PyQuery as pq

doc = pq(url="https://www.baidu.com")

div = doc('.card')

#使用find查找标签
img = div.find('img')

print(img)

只想查找子节点,那么可以用children()方法

from pyquery import PyQuery as pq

doc = pq(url="https://www.baidu.com")

div = doc('.card')

#使用children查找直接子节点
img = div.children('a')

print(img)

2.父节点

    我们可以用parent()方法来获取某个节点的父节点(直接父节点)

from pyquery import PyQuery as pq

doc = pq(url="")

#首先定位子节点
items = doc('.fa')

#子节点的直接父节点
contains = items.parent()
print(contains)

如果是祖父节点,也就是父节点的父节点使用parents()

from pyquery import PyQuery as pq

doc = pq(url="https://.com")

#首先定位子节点
items = doc('.fa')

#子节点的祖父节点
contains = items.parents()

print(contains)

3.兄弟节点

  如果使用兄弟节点那么使用siblings()方法

from pyquery import PyQuery as pq

doc = pq(url="")

#首先定位元素
items = doc('.card-text')

#兄弟节点,同级
contains = items.siblings()

print(contains)

4.遍历

 pyquery选择的可能是多个节点,也可能是单个节点,对于多个节点的结果,我们就需要使用遍历了

from pyquery import PyQuery as pq

doc = pq(url="")

#多个节点
list = doc('.card').items()

print(type(list))

#遍历输出每一个
for div in list:

    print(div)

 

5.获取信息

  节点我们说完了,那么我们就要获取节点中的信息了,获取文本或者获取属性

获取属性attr()

from pyquery import PyQuery as pq

doc = pq(url="")

#多个节点,加items()表示全部
img = doc('.card .lazyload').items()

for i in img:  
    #获取属性
    img_href = i.attr('data-src')
    #img_href = i.attr.data-src
    print(img_href)

获取文本使用text()和html()

from pyquery import PyQuery as pq

doc = pq(url="")

#多个节点,加items()表示全部
infos = doc('.btn').items()

for i in infos:  
    #获取文本
    info = i.text()
    #带有html的文本形式
    info_html = i.html()
    print(info,info_html)

上面的attr(属性名,属性值),text("修改文本")html("<a></a>")可以直接修改参数

6.节点操作

  pyquery提供了一系列方法来对节点进行动态修改,比如为某个节点添加一个class,移除某个节点等。这些操作有时候会为提取信息带来极大的便利

  addClass()和removeClass()这些方法动态改变节点的class属性

from pyquery import PyQuery as pq

doc = pq(url="")

#查询
img = doc('.card a img')

print(img)
#去除class为lazyload
img.removeClass('lazyload')

print(img)

7.移除remove()

  remove()方法就是移除元素

from pyquery import PyQuery as pq
html = '''

<div class="wrap">
     Hello,world
     <p>This is a man</p>
    </div>
'''
doc = pq(html)

#获取hello world
wrap = doc('.wrap')

wrap.find('p').remove()

print(wrap.text())

一些常用的方法append(),empty()和prepend()等方法,它们和jQuery用法完全一致

官方文档:http://pyquery.readthedocs.io/en/latest/api.html

8.伪类选择器

from pyquery import PyQuery as pq
html = '''

<!DOCTYPE html>
<html>
<head>
    <title>故事</title>
</head>
<body>
   <p class="title" name="dromouse"><b>这个是dromouse</b></p>
   <p class="story">Once upon a time there were three little sister;
       and their names were
       <a href="http://www.baidu.com" class="sister" id="link1"><!--GH--></a>
       <a href="http://www.baidu.com/oracle" class="sister" id="link2">Local</a>and
       <a href="http://www.baidu.com/title" class="sister" id="link3">Tillie</a>;
   and they lived at the bottom of a well.</p>
   <p class="story">...</p>
   <ul>
       <li>1</li>
       <li>2</li>
       <li>3</li>
       <li>4</li>
   </ul>
    
</body>
</html>

'''
doc = pq(html)

li_f = doc("li:first-child")
li_l = doc("li:last-child")
li_n = doc("li:nth-child(2)")
li_n = doc("li:nth-child(2n)")
li_text = doc("li:contains(were)")
li = doc("li:gt(2)")

 

      学习网站:

                                                       

 

posted @ 2020-04-21 18:03  Crown-V  阅读(216)  评论(0)    收藏  举报