一步一步学爬虫(3)网页解析之pyquery的使用
发布时间:2023-01-12 06:40:32 303
相关标签: # html# webkit# python# 爬虫
(一步一步学爬虫(3)网页解析之pyquery的使用)
3.3 一步一步学爬虫(3)网页解析之pyquery的使用
本来不想再抄写这部分内容,但是看了下这个方法的使用,有这么多重要的功能,还是抄写在这里,方便自己查阅,书本太厚,真的不如App方便。 上一篇的BeautifulSoup的方法,有许多不方便的,再学习pyquery的强大功能,特别是CSS方法。
3.3.1 准备工作
- 还是安装
pip3 install pyquery
3.3.2 初始化
- 在pyquery库解析HTML文本的时候,需要把这个页面初始化为一个pyquery对象。
字符串初始化
# -*- coding: UTF-8 -*-
html = '''
<html>
<body>
<div id="container">
<ul class="list">
<li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
<li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
<li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
<li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
<li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
</ul>
</div>
</body>
</html>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('li'))
- 上面使用CSS选择器,传入li节点,可以选择所有的li节点了。
<li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
<li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
<li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
<li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
<li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
URL初始化
from pyquery import PyQuery as pq
doc = pq(url='https://cuiqingcai.com')
print(doc('title'))
- 运行结果。
<title>静觅丨崔庆才的个人站点 - Python爬虫教程</title>
文件初始化
- 除了上面两种情况,还可以传入本地文件名,进行初始化。
doc = pq(filename='demo.html')
print(doc('li'))
3.3.3 基本CSS选择器
html = '''
<html>
<body>
<div id="container">
<ul class="list">
<li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li>
<li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li>
<li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li>
<li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li>
<li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
</ul>
</div>
</body>
</html>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))
-
这个代码的意思是,用CSS选择器,选取id为container的节点,再选取其内部class为list的节点内部的所有li节点。
-
当然,可以在上代码基础上,继续调用text方法,得到里面的内容。
for item in doc('#container .list li').items(): print(item.text())
-
得到如下结果。
first item second item third item fourth item fifth item
- 显然,用这个办法,比正则表达式,还要省事。
3.3.4 查找节点
(1)子节点
-
接着上面HTML代码,再用find方法,加上其参数CSS选择器,查找子节点。
from pyquery import PyQuery as pq doc = pq(html) items = doc('.list') print(type(items)) print(items) lis = items.find('li') print(type(lis)) print(lis)
-
运行结果如下:
<class 'pyquery.pyquery.PyQuery'> <ul class="list"> <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li> <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li> <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li> <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li> <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li> </ul> <class 'pyquery.pyquery.PyQuery'> <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li> <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li> <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li> <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li> <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li>
(2)父节点
-
父节点就是把children换成parent即可。
items = doc('.list') lis = items.parent() print(type(lis)) print(lis)
-
结果是上层div的内容。
<class 'pyquery.pyquery.PyQuery'> <div id="container"> <ul class="list"> <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li> <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li> <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li> <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li> <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li> </ul> </div>
-
如果想获取祖先节点,可以用parents方法。
items = doc('.list') lis = items.parents() print(type(lis)) print(lis)
-
这个方法会把所有父节点、祖先节点都选了出来,要想定位到某一个祖先节点,再加上一个CSS选择器即可。如:
# -*- coding: UTF-8 -*- html = ''' <html> <div class="wrap"> <div id="container"> <ul class="list"> <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li> <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li> <li class="item-inactive"><a rel="nofollow" href="link3.html">third item</a></li> <li class="item-1"><a rel="nofollow" href="link4.html">fourth item</a></li> <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li> </ul> </div> </div> </html> ''' from pyquery import PyQuery as pq doc = pq(html) items = doc('.list') lis = items.parents('.wrap') print(type(lis)) print(lis)
(3)兄弟节点
-
还是上面的例子,兄弟节点用到了siblings方法。
# -*- coding: UTF-8 -*- html = ''' <html> <div class="wrap"> <div id="container"> <ul class="list"> <li class="item-0"><a rel="nofollow" href="link1.html">first item</a></li> <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li> <li class="item-0 active"><a rel="nofollow" href="link3.html">third item</a></li> <li class="item-1 active"><a rel="nofollow" href="link4.html">fourth item</a></li> <li class="item-0"><a rel="nofollow" href="link5.html">fifth item</a></li> </ul> </div> </div> </html> ''' from pyquery import PyQuery as pq doc = pq(html) li = doc('.list .item-0.active') lis = li.siblings() print(type(lis)) print(lis)
-
结果如下:
<li class="item-1 active"><a rel="nofollow" href="link4.html">fourth item</a></li><class 'pyquery.pyquery.PyQuery'>
文章来源: https://blog.51cto.com/u_15930659/5991045
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报