python模块详解 | pyquery

简介

pyquery是一个强大的 HTML 解析库,利用它,我们可以直接解析 DOM 节点的结构,并通过 DOM 节点的一些属性快速进行内容提取。

官方文档:http://pyquery.readthedocs.io/

安装

pip3 install pyquery

初始化

🍑 字符串初始化

html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('li'))

🥭 URL初始化

from pyquery import PyQuery as pq
doc = pq(url='https://baidu.com')
print(doc('title'))

🍉 文件初始化

from pyquery import PyQuery as pq
doc = pq(filename='demo.html')
print(doc('li'))

基本CSS选择器

🍎 id选择器(#)

🍊 class选择器(.)

html = '''
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))

查找节点

🍎 子节点

  • find()
  • children()
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')

#find()
lis = items.find('li')
print(lis)

#children()
lis = items.children()
print(lis)

🍊 父节点

  • parents()

🥝 兄弟节点

  • siblings()

ps:以上方法均可传入css选择器

🐂 同时根据标签和属性识别

a = '''
<body>
    <h>标题</h>
    <p id='p1'>段落1</p>
    <p id='p2'>段落2</p>
    <p class='p3'>段落3</p>
    <p class='p3' id='pp'>段落4</p>
</body>
'''

doc = pq(a)
doc('p#p1').text() # '段落1'
doc('p.p3[id]').text() # 含有id属性
doc('p.p3#pp').text() # 使用多个属性筛选
doc('p[class=p3][id=pp]').text()
doc('p[class=p3], p[id=p1]').text() # 或的关系
doc('p[class=p3],[id=p1]').text() # 或者只用,隔开
doc('*#p1').text() # 不指定标签名

# 否定
doc('p:not([id])').text() # 不含有id属性
doc('body :not(p)').text() # 选出不是p的子节点  '标题'
doc('p:not(.p3)').text() # 选出class不是p3的
doc('p[id][id!=p2]').text() # 也可以用!=,这里选择有id且id不是p2的

# 类似正则表达式
doc('p[id^=p]').text() # 首端匹配
doc('p[id$=p]').text() # 尾端匹配
doc('p[id*=p]').text() # 包含

遍历

🚴‍♀️ 单个节点

doc = pq(html)
li = doc('.active')
print(li)

🚴 多个节点(遍历)

  • items()
doc = pq(html)
lis = doc('li').items()
for li in lis:
    print(li, type(li))

获取信息

🚗 属性

  • attr()
doc = pq(html)
a = doc('a')
print(a.attr('href'))  #href属性的值
#或
print(a.attr.href) #href属性的值

🚄 文本

  • text() 返回标签内部纯文本内容
doc = pq(html)
a = doc('a')
print(a.text())
  • html() 返回标签内部html文本内容
doc = pq(html)
li = doc('li')
print(li.html())

dom操作

html = '''
<head>
  <meta charset="utf-8"/>
  <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
  <title> Notes | 人人都爱小雀斑's blog </title>
</head>
<body class="max-width mx-auto px3 ltr">
    <h1>人人都爱小雀斑's blog</h1>
<footer id="footer">
  <div class="footer-center">
    Copyright  
    © 
    2020-2021 
    <span>❤ Billie  </span>  
    <span>粤ICP备20025795号-1 </span><br/>
    <span>Powered By HUGO | </span>
    <span id="busuanzi_container_site_uv">
        访客 <span id="busuanzi_value_site_uv"/> 
    </span>
  </div>
</footer>
</body>

'''
from pyquery import PyQuery as pq
doc = pq(html)
# 添加class
doc('footer').addClass('footer')
# 删除class
doc('.max-width').removeClass('max-width')
# 修改某个属性的值、添加自定义属性
doc('#footer').attr('id','footer_new')
doc('#footer').attr('tab','burn_them_all')
# 删除某个节点
doc('#busuanzi_container_site_uv').remove()
print(doc)


958 字