python pyquery 详细用法

1.安装方法

pip install pyquery

2.引用方法

from pyquery import PyQuery as pq

3.简介

 pyquery 是类型jquery 的一个专供python使用的html解析的库,使用方法类似bs4。

4.使用方法

4.1 pyquery 初始化方法:

from pyquery import PyQuery as pq
doc =pq(html) #解析html字符串的方式
doc =pq("http://news.baidu.com/") #通过url方式解析网页
doc =pq("./a.html") #通过文件的方式解析html 文本

 4.2 pyquery的方法跟CSS选择器是一样的

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
print(doc("#wrap .s_from link")) # 对比一下css选择器,呵呵,完全一样,极度舒适

python 运行结果:

<link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>

#是查找id的标签  .是查找class 的标签  link 是查找link 标签 中间的空格表示里层

4.3 pyquery查找子元素

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
# pyquery查找子元素
doc = pq(html)
items = doc("#wrap")
print(items)
print("类型为:%s" % type(items))
link = items.find('.s_from')
print(link)
link = items.children()
print(link)

python 运行结果:

<div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
        </ul>
    </div>
类型为:<class 'pyquery.pyquery.PyQuery'>
<ul class="s_from">
            xinbiancheng.cn 新编程
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
        </ul>
    
<ul class="s_from">
            xinbiancheng.cn 新编程
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
        </ul>

根据运行结果可以发现返回结果类型为pyquery,并且find方法和children 方法都可以获取里层标签

4.4 pyquery 查找父元素

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
items = doc(".s_from")
print('打印当前节点')
print(items)
#pyquery查找父元素
print('打印父节点')
parent_href = items.parent()
print(parent_href)

python 运行结果:

打印当前节点
<ul class="s_from">
            xinbiancheng.cn 新编程
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
        </ul>
    
打印父节点
<div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn">xinbiancheng.cn 新编程</link>
        </ul>
    </div>

parent可以查找出外层标签包括的内容,与之类似的还有parents,可以获取所有外层节点

4.5 pyquery 查找兄弟元素

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link class='html' href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
items = doc("link.html")
print('打印当前节点')
print(items)
#pyquery查找兄弟元素
print('打印兄弟节点')
siblings_href = items.siblings()
print(siblings_href)

python 运行结果:

打印当前节点
<link class="html" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            
打印兄弟节点
<link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
根据运行结果可以看出,siblings 返回了同级的其他标签

结论:子元素查找,父元素查找,兄弟元素查找,这些方法返回的结果类型都是pyquery类型,可以针对结果再次进行选择

4.6 pyquery 遍历查找结果

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link class='html' href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
its=doc("link").items() # pyquery遍历
for it in its:
    print(it)

python 运行结果:

<link class="html" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            
<link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            
<link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>

4.7 pyquery 获取属性信息

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link class='html' href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
its = doc("link").items()
for it in its:
    print(it.attr('href'))  # 获取属性信息
    print(it.attr.href)  # 获取属性信息

python 运行结果:

http://www.xinbiancheng.cn/html/
http://www.xinbiancheng.cn/html/
http://www.xinbiancheng.cn/css/
http://www.xinbiancheng.cn/css/
http://www.xinbiancheng.cn/js/
http://www.xinbiancheng.cn/js/

4.8 pyquery 获取文本

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link class='html' href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
its=doc("link").items()
for it in its:
    print(it.text())  # 获取文本信息

python 运行结果

html xinbiancheng.cn 新编程
css xinbiancheng.cn 新编程
JavaScript xinbiancheng.cn 新编程

4.9 pyquery获取 HTML信息

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link class='html' href="http://www.xinbiancheng.cn/html/"><p>html xinbiancheng.cn 新编程</p></link>
            <link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
its=doc("link").items()
for it in its:
    print(it.html())  # 获取 HTML信息 如果html元素中有标签信息将获取到标签

python 运行结果:

<p>html xinbiancheng.cn 新编程</p>
css xinbiancheng.cn 新编程
JavaScript xinbiancheng.cn 新编程

5.常用DOM操作

5.1 pyquery addClass removeClass

  添加,移除class标签

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link class="html" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
its=doc("link").items()
for it in its:
    print("添加:%s"%it.addClass('active1'))
    print("移除:%s"%it.removeClass('active1'))

python 运行结果

添加:<link class="html active1" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            
移除:<link class="html" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            
添加:<link href="http://www.xinbiancheng.cn/css/" class="active1">css xinbiancheng.cn 新编程</link>
            
移除:<link href="http://www.xinbiancheng.cn/css/" class="">css xinbiancheng.cn 新编程</link>
            
添加:<link href="http://www.xinbiancheng.cn/js/" class="active1">JavaScript xinbiancheng.cn 新编程</link>
        
移除:<link href="http://www.xinbiancheng.cn/js/" class="">JavaScript xinbiancheng.cn 新编程</link>

需要注意的是已经存在的class标签不会继续添加

5.2 pyquery attr css

  attr 为获取/修改属性 css 添加style属性

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link class="html" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
its=doc("link").items()
for it in its:
    print("修改:%s"%it.attr('class','active'))
    print("添加:%s"%it.css('font-size','14px'))

python 运行结果

修改:<link class="active" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            
添加:<link class="active" href="http://www.xinbiancheng.cn/html/" style="font-size: 14px">html xinbiancheng.cn 新编程</link>
            
修改:<link href="http://www.xinbiancheng.cn/css/" class="active">css xinbiancheng.cn 新编程</link>
            
添加:<link href="http://www.xinbiancheng.cn/css/" class="active" style="font-size: 14px">css xinbiancheng.cn 新编程</link>
            
修改:<link href="http://www.xinbiancheng.cn/js/" class="active">JavaScript xinbiancheng.cn 新编程</link>
        
添加:<link href="http://www.xinbiancheng.cn/js/" class="active" style="font-size: 14px">JavaScript xinbiancheng.cn 新编程</link>

attr css操作直接修改对象的

5.3 pyquery remove

  remove 移除标签

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
    我是div内容
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link class="html" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
its=doc("div")
print('移除前获取文本结果:\n%s'%its.text())
it=its.remove('ul')
print('移除后获取文本结果:\n%s'%it.text())

python 运行结果

移除前获取文本结果:
我是div内容
xinbiancheng.cn 新编程
html xinbiancheng.cn 新编程
css xinbiancheng.cn 新编程
JavaScript xinbiancheng.cn 新编程
移除后获取文本结果:
我是div内容

其他DOM方法参考:

  HTML DOM Document 对象

6. pyquery 伪类选择器

from pyquery import PyQuery as pq
html = '''
    <div id="wrap">
    我是div内容
        <ul class="s_from">
            xinbiancheng.cn 新编程
            <link class="html" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        </ul>
    </div>
'''
doc = pq(html)
its=doc("link:first-child")
print('第一个标签:%s'%its)
its=doc("link:last-child")
print('最后一个标签:%s'%its)
its=doc("link:nth-child(2)")
print('第二个标签:%s'%its)
its=doc("link:gt(0)") #从零开始
print("获取0以后的标签:%s"%its)
its=doc("link:nth-child(2n-1)")
print("获取奇数标签:%s"%its)
its=doc("link:contains('css')")
print("获取文本包含css文字的标签:%s"%its)

python 运行结果

第一个标签:<link class="html" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            
最后一个标签:<link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        
第二个标签:<link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            
获取0以后的标签:<link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        
获取奇数标签:<link class="html" href="http://www.xinbiancheng.cn/html/">html xinbiancheng.cn 新编程</link>
            <link href="http://www.xinbiancheng.cn/js/">JavaScript xinbiancheng.cn 新编程</link>
        
获取文本包含css文字的标签:<link href="http://www.xinbiancheng.cn/css/">css xinbiancheng.cn 新编程</link>

更多css选择器可以查看: