在之前写的爬虫入门里,PyQuery一笔带过,这次详细地讲一下。

为什么选择PyQuery?

Python爬虫解析库,主流的有

  • PyQuery

  • Beautifulsoup

  • Scrapy Selectors

  • 正则表达式。

PyQuery和scrapy Selectors都是基于lxml模块,而lxml和正则表达式都是C语言写的,只有Beautifulsoup是用纯Python编写的,所以在实测中,Beautifulsoup 的解析速度比其他几种慢了5倍以上!

正则表达式的构造稍微复杂一点,一般在结构化的网页中没必要用正则(易出错)。Scrapy Selectors支持css,xpath以及正则表达式,PyQuery只支持css(我最开始学的是xpath,后来觉得css语法更精简一些)。Scrapy Selector中的css语法和PyQuery中的略有不同,本文以PyQuery为例(不用Scrapy框架的话,PyQuery就够用了)

如何使用?

首先在命令行里 pip install pyquery 安装一下

我们以果壳首页为例,首先引入,并将源代码实例化

import requestsfrom pyquery import PyQuery as pqurl = 'https://www.guokr.com/'r = requests.get(url)#实例化doc = pq(r.text)
获取文本

例如你想要各个板块的名字

通过f12查看源代码,你发现板块名都在class值为content-title的h2标签下

在PyQuery中,class的值写在小数点 . 后面,标签直接写(ID是写在#后面)

print(doc('h2.content-title'))

于是所有满足条件的源代码都出来了,获取标签的文本内容用text()

print(doc('h2.content-title').text())

想遍历的话,

lis = doc('h2.content-title').items()for li in lis:    print(li.text())

假设我们想要获取所有标题

看源代码会发现 ,小标题的内容都在div.content下面的ul标签 下面的 第二个li标签 开始(通过缩进来看嵌套关系),而第一个li标签里面是大标题的内容

#用空格表示子孙节点lis = doc('div.content ul li').items()#lis = doc('div.content li').items()for i in lis:    print(i.text())

空格表示子孙节点,只要在div.content标签下面的节点,都能获取到

所以上面的代码可以省略ul标签,直接到li标签

有时候标签会有多个类名的情况,例如(我随便构造一个):

假设类名为cont的标签不唯一,也就是通过cont不能准确地定位这一个标签,还需要加上其他类名

print(doc('div.cont.a.b.c.d'))

标签里的空格表示并列,表示这个div标签有cont,a,b,c,d这五个类名,但在css语法里空格表示嵌套,所以我们要添加其他类名的时候不能输入空格,而是直接用小数点来添加其他类名

获取属性

前面说了获取文本用text(),现在介绍获取属性的方法,即attr("属性名"),比方说我们要获取所有标题的链接,一般来说链接都在href属性里

lis = doc('div.content li').items()for i in lis:    print(i.text(),i('a').attr('href'))

剩下的一些选择器方法就不赘述了,列出来大家试一下应该就能明白了

lis = doc('div.content ul li')#父节点,包含父节点的所有子孙节点的内容#相当于#print(doc('div.content ul'))print(lis.parent())#祖先节点,就相当于所有源代码了print(lis.parents())#兄弟节点,即同级节点,不包含自己print(lis.siblings)
其他技巧

1.伪类选择器

如果想要每个版块的第一条小标题的话

#第二个标签lis = doc('div.content li:nth-child(2)').items()for i in lis:    print(i.text(),i('a').attr('href'))

第一个a标签的语法是 a:first-child,最后一个是a:last-child,其它位置的语法如上图所示,第几个括号里就是几(当然第一个你也可以写成 li:nth-child(1))

类似地,如果你想要只要小标题,也就是从第二个li开始到最后一个li

#div.content 下面第二个(含)之后的li标签lis = doc('div.content li:gt(1)').items()for i in lis:    print(i.text(),i('a').attr('href'))

gt就是greater than,大于的意思,lt (less than)是小于

还可以用伪类选择器来筛选文本

lis = doc('div.content ul').items()for i in lis:    #文本包含问号的li标签    print(i("li:contains('?')").text())

2.修改标签属性

如果我只想要小标题,这里再介绍一种方法

从源代码来看,想要所有小标题就是要排除ul标签下面的第一个li标签,通过观察发现它的特点就是类名(class值)为content-article,而其它li标签没有,所以我们可以利用这点

#用remove把特定标签移除,然后再进行遍历lis = doc('div.content ul').remove('.content-article').items()for i in lis:    print(i.text())

PyQuery里还有一些方法,比如修改属性,增加css之类的一些使用率较低的就不介绍了,详情可参考pyquery官方文档的 PyQuery complete API

直接在Chrome里调试

其实我们的Chrome浏览器自带css的查询方法,按f12或者右键检查,打开Elements面板,按ctrl+f,

这里支持xpath,css语法,以及普通的字符查找

要注意的是右边的数字,显示的是满足条件的标签数量,可以按向下的箭头过一遍,看看是不是自己想要的信息。

稍微认真写一下就发现知识点还是挺多的,看来这篇详解还是有点意义的。

感谢观看!

pyquery获取不到网页完整源代码_PyQuery 详解相关推荐

  1. pyquery获取不到网页完整源代码_python动态网页爬取:爬取pexel上的图片

    前言 同样的,我们在写一个爬虫前要明确自己想要爬取的东西是什么,明确下载目标数据在浏览器的操作如何 对于动态网页的爬取,在网页地址不变的情况下,我们首先要明确如何获取AJAX请求 首先我们看看这个网站 ...

  2. pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...

    爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...

  3. flutter 获取android 还是ios_Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)...

    作为系列文章的第二十篇,本篇将结合官方的技术文档科普 Android 上 PlatformView 的实现逻辑,并且解释为什么在 Android 上 PlatformView 的键盘总是有问题. 为什 ...

  4. Flutter完整开发实战详解(二、 快速开发实战篇) | 掘金技术征文

     作为系列文章的第二篇,继<Flutter完整开发实战详解(一.Dart语言和Flutter基础)>之后,本篇将为你着重展示:如何搭建一个通用的Flutter App 常用功能脚手架,快速 ...

  5. 金蝶云星空html5的网页主界面如何修改,金蝶云星空系统与嵌套网页进行交互实现详解...

    金蝶云星空系统与嵌套网页进行交互实现详解 一.应用场景: 嵌套网页与金蝶云星空进行数据交互,例如:在被嵌套网页中,点击一个按钮,需要把数据发送到金蝶云星空系统当中,并且,星空系统接收发过来的数据,同时 ...

  6. Flutter完整开发实战详解(十七、 实用技巧与填坑二)

    作为系列文章的第十七篇,本篇再一次带来 Flutter 开发过程中的实用技巧,让你继续弯道超车,全篇均为个人的日常干货总结,以实用填坑为主,让你少走弯路狂飙车. Flutter 完整实战实战系列文章专 ...

  7. python怎么读文件夹下的文件夹-python如何获取当前文件夹下所有文件名详解

    前言 本文主要给大家介绍了关于python获取当前文件夹下所有文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 os 模块下有两个函数: os.walk() os.li ...

  8. php 得到 ts文件,获取TypeScript声明文件.d.ts步骤详解

    这次给大家带来获取TypeScript声明文件.d.ts步骤详解,获取TypeScript声明文件.d.ts的注意事项有哪些,下面就是实战案例,一起来看一下. 一.TypeScript的声明文件就像C ...

  9. vue 子级拿值_vue 父组件通过$refs获取子组件的值和方法详解

    前言 在vue项目中组件之间的通讯是很常见的问题,同时也是很重要的问题,我们大致可以将其分为三种情况: 父传子:在父组件中绑定值,在子组件中用props接收 子传父:在父组件中监听一个事件,在子组件中 ...

最新文章

  1. python编辑svg文件_如何使用librsvg Python绑定调整svg映像文件的大小
  2. MySQL存储引擎中的MyISAM和InnoDB区别详解
  3. 单机版五子棋java功能_java实现单机版和网络对战版五子棋程序
  4. 去掉 Android工程中让人很不爽的“黄色警告”
  5. boost::range_const_iterato相关的测试程序
  6. Subversion Server For Windows安装指南
  7. Shell下的环境变量
  8. 发布到服务器接口404_接口测试怎么做?
  9. 功能Java示例 第4部分–首选不变性
  10. 北京大学计算机系 丁主任,丁骋、李时新参加第七届新闻史论青年论坛暨北京大学新闻学研究会年会...
  11. Mac Big Sur如何关闭开机提示音效
  12. 首篇NLP图神经网络综述!127页文档让你全面了解这个领域
  13. Hive中NULL的含义
  14. 十大 Node.js 的 Web 框架,快速提升工作效率
  15. javamail 解码 base64 html格式邮件_关于JavaMail,我遇上的那些史前巨坑...(建议收藏)
  16. SqlServer 2008还原数据库步骤
  17. DOSBOX常用快捷键DEBUG指令
  18. 毕业设计之甘特图制作
  19. pix4d无人机影像处理_PhotoScan和Pix4Dmapper的无人机影像快速处理模式对比实验
  20. C# Behavior Tree -- 行为树

热门文章

  1. java txtreader_一个简单的Java读写文件例子
  2. com组件的ref有时需要有时不需要?_Vue3组件通信总结
  3. vb红绿灯自动切换_什么是自动驻车
  4. Python基础教程:列表推导式对比For循环执行效率
  5. Python:两个队列实现栈,两个栈实现队列
  6. python爬虫代码优化:使用生成器重构提取数据方法
  7. Python的正则表达式和爬虫
  8. python之简单的get和post请求
  9. 插入排序、选择排序、快速排序以及归并排序(附Python代码)
  10. billibilli html5播放,Thousands of people online are involved in ef...