pyquery解析库可以让我们根据标签筛选文本
相关链接:https://pyquery.readthedocs.io/en/latest/
目录
1、准备工作 2、功能示范 3、属性获取
4、例子示范 5、实战
1、准备工作
在开始前请确保已经安装好了pyquery,没有的话请参考之前的爬虫开发环境部署教程
2、功能示范
字符串初始化
from pyquery import PyQuery as pq
html_text = '''
<html>
<head></head>
<body>
<div class="name">
<li>pyquery</li>
</div>
</body>
</html>
'''
doc = pq(html_text)
li = doc('li')
print(li.text())
运行结果:
pyquery
将HTML代码传入pyquery初始化
URL初始化
from pyquery import PyQuery as pq
doc = pq(url='https://www.baidu.com')
a = doc('title')
print(a.text())
它和下面的代码功能相同
from pyquery import PyQuery as pq
import requests
doc = pq(requests.get(url='https://www.baidu.com').text)
a = doc('li')
print(a.text())
这个方法我比较推荐,它可以加入请求头,避免被发现为程序访问
3、属性获取
和XPath一样pyquery也可以获取节点属性,调用attr()方法获取属性
from pyquery import PyQuery as pq
html_text = '''
<html>
<head></head>
<body>
<div class="name">
<a href="https://www.baidu.com">百度一下</span>
</div>
</body>
</html>
'''
doc = pq(html_text)
a = doc('a')
print(a.text())
print(a.attr('href'))
运行结果:
百度一下
https://www.baidu.com
写法二:
因为这个a标签在class="name"的div标签下,所以也有另一种写法
from pyquery import PyQuery as pq
html_text = '''
<html>
<head></head>
<body>
<div class="name">
<a href="https://www.baidu.com">百度一下</span>
</div>
</body>
</html>
'''
doc = pq(html_text)
a = doc('.name a')
print(a.text())
print(a.attr('href'))
4、例子示范
from pyquery import PyQuery as pq
html_text = '''
<html>
<head></head>
<body>
<div class="name">
<a href="https://www.baidu.com">百度一下</span>
<li>1</li>
<li>2</li>
<li>3</li>
</div>
</body>
</html>
'''
doc = pq(html_text)
a = doc('li')
print(a.text())
运行结果:
1 2 3
5、实战
这个可以用于文字多的页面小说、新闻等
目标网站:
https://read.qidian.com/chapter/TOxiwmgRNSfffahp3g1tpg2/nULzklzMzHX6ItTi_ILQ7A2

分析网页结构:

发现文本都在class=”read-content j_readContent“的div下的p标签内
代码如下:
p = doc('.read-content.j_readContent p')
print(p.text())
这样就可以把所有文本都筛选出来了
from pyquery import PyQuery as pq
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36'
}
url = '目标网站'
doc = pq(requests.get(url, headers=headers).text)
p = doc('.read-content.j_readContent p')
print(p.text())
十行不到的代码就完成了一个爬虫