Python公开课 - 页面解析之pyquery

前言

pyquery

pyquery是一个非常强大又灵活的网页解析库,如果你觉得BeautifulSoup语法太难记,如果你熟悉jQuery的语法,那么pyquery就是不错的选择。它允许您对xml文档进行jquery查询,API与与jquery类似,使用lxml进行快速xml和html操作。

安装

可以直接通过pip进行安装

pip3 install pyquery

基本使用

字符串初始化

from pyquery import PyQuery as pq
from lxml import etree
import urllib

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="links.html">fifth item</a></li>
    </ul>
  </div>
"""

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

结果输出:

输出:
<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="links.html">fifth item</a></li>

这里首先引人PyQuery这个对象,取别名为pq。

然后声明了一个示例html内容作为参数传递给PyQuery 类,这样就成功完成了初始化。

我们对这个实例传入li节点,这样就可以选择所有的li节点。

URL来进行初始化

from pyquery import PyQuery as pq
doc = pq(url="http://www.xtuz.net")
print(doc('title'))

结果输出:

输出:
<title>兔子先生-技术栈</title>

PyQuery 对象会自动请求这个URL, 然后将想赢的 HTML 内容完成初始化。

文件初始化

from pyquery import PyQuery as pq 
doc = pq(filename='test.html')

首先读取本地test.html的文件内容,然后用文件内容以字符串的形式传递给PyQuery类来初始化。

CSS选择器

我们将上面的例子做一点修改

from pyquery import PyQuery as pq
from lxml import etree
import urllib

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="links.html">fifth item</a></li>
    </ul>
  </div>
"""

doc = pq(html)
#print(doc('li'))
print(doc('#container .list li' ))
print(type(doc('#container .list li')))


结果输出:

输出:
<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="links.html">fifth item</a></li>

<class 'pyquery.pyquery.PyQuery'>

代码解释

在完成PyQuery对象初始化后,传入了一个CSS选择器#container .list li,含义就是先寻找id为container的元素,然后在起子类寻找class为list的元素,最后将其子类的所有li节点找到。

规则说明

key value 说明
.class .list 选择class="list"的所有元素
id container 选择 id="container"元素
element p 选择所有p元素
element, element div, p 选择所有div元素和p元素
element, element div p 选择div元素内所有p元素
[attribute] target 选择带有target属性的所有元素
[attribute=target] [href="http://xtuz.net"] 选择链接到http://www.xtuz.net的元素


查找

find()查找

find()的查找范围是节点的所有子孙节点

print(doc.find('li'))


结果输出:

输出:
<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="links.html">fifth item</a></li>

数据抽取

提取属性

调用attr()方法来获取属性:

print(doc.find('.item-0.active').attr('class'))

结果输出:

输出:
item-0 active

提取文本

调用text()方法来获取文本

print(doc.find('.item-0.active').text())

结果输出:

输出:
third item

text()方法会忽略节点内部html标记,只返回纯文字内容。 但如果想要获取该节点原始内容,就要用html()

print(doc.find('.item-0.active').html())


结果输出:

输出:
<a href="link3.html"><span class="bold">third item</span></a>

小结

pyquery还可以支持修改页面,通过addClass()removeClass()对节点的样式进行编辑。也可以通过attr(), text(), html()方法来对节点的属性和内容进行修改。

考虑到是从爬虫的角度来阐述,原则来说,不会对页面内容进行修改,所以本章不做更多介绍。

小技巧

怎么用pyquery取到第二个p节点。

from pyquery import PyQuery
content = PyQuery("str1")
two_class = content(".class:nth-child(2)") #选取的百是第二度个知class对象道

相关阅读


相关推荐
  1. 叶子王国
  2. 佛山市第二十八小学
  3. 宜黄县安石中学
  4. 邕宁区那楼镇那务小学
  5. 广东省雷州市覃斗镇讨泗小学
  6. Vim - 基础教程
  7. 黄鼠狼偷蛋
  8. 挥斧如风
  9. 海口市琼山区童星艺术幼儿园 - 海南省幼儿园黄页
  10. 图像处理工具ImageMagick - 灰度化和二值化
  11. 沈阳市第十九中学
  12. 广州市白云区苗茵幼儿园 - 广州幼儿园黄页
  13. 定州市花张蒙中学
  14. 武汉一女子七天被骗220万
  15. 开心幼儿园 - 成都市幼儿园黄页
  16. 武汉00后大二学妹拍视频月入七十万
  17. 事发武汉农夫山泉矿泉水内惊现大量虫卵
  18. 妄发议论的狐狸
  19. 北京市通州区马驹桥镇小张湾村幼儿园 - 北京幼儿园黄页
  20. 哈尔滨市道外区小哈尼幼儿园 - 哈尔滨幼儿园黄页
  21. 三个军医
  22. 奥迪客户不满加价,被武汉4S店销售群殴
  23. 易中天给英雄武汉的一首诗 - 武汉新鲜事
  24. Python公开课 - 爬虫介绍
  25. 清流县田源初级中学
  26. 难过的弗洛格
  27. 华中科技大学附属小学
  28. Ubuntu安装X11VNC实现远程可视化桌面简明教程
  29. 韶关市乐昌市中英文学校
  30. 6个月以内的婴儿要不要喝水 - 育儿经验
  31. 沈阳市铁路第五小学
  32. 武汉推出越王勾践剑交通卡
  33. 南宁市第三中学
  34. 郑州市郑东新区外国语学校小学部
  35. 武汉女子网上做兼职被骗六十五万
  36. 快乐的藤架
  37. 上海市虹口区密云幼儿园曲阳部 - 上海幼儿园黄页
  38. 新泰市向阳实验学校
  39. 福州市第四中学
  40. 婴儿刚洗完澡能吃奶吗 - 育儿经验
  41. 佛山市逢沙小学
  42. 憋不住话的乌龟
  43. python3.5升级python3.6后出现 No module named apt_pkg 异常
  44. OpenJDK与Oracle JDK的区别
  45. 济南章丘市汇泉小学
  46. 青藤城堡
  47. 上海市杨思中学
  48. 脱单!武汉的相亲角在哪你知道吗?
  49. Python公开课 - 基础数据类型
  50. 天津市蓟县七彩阳光幼儿园 - 天津幼儿园黄页
  51. 唐山市第二十六中学
  52. 长春市二道区童乐双语幼儿园(长春市二道区民政局婚姻登记处东北) - 长春幼儿园黄页
  53. 央媒聚焦!国庆假期173.78万人次打卡大美黄陂
  54. 湖北将发放消费券 - 武汉新鲜事
  55. Ads.txt是什么
  56. 技术破解钉钉打卡考勤 - 苹果手机专用完整解决方案
  57. 汕头市汕樟中学
  58. 名人故事:丘吉尔和弗莱明
  59. 韶关市乐昌市九峰镇浆源小学
  60. Python公开课 - 标准库Decimal详解