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操作
- https://www.jb51.net/article/182279.htm
addClass('class_name')
removeClass('class_name')
attr()
css()
remove()
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)