`
zhimaruanjian
  • 浏览: 32688 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

芝麻HTTP: Python爬虫利器之PyQuery的用法

 
阅读更多

前言

你是否觉得 XPath 的用法多少有点晦涩难记呢?

你是否觉得 BeautifulSoup 的语法多少有些悭吝难懂呢?

你是否甚至还在苦苦研究正则表达式却因为少些了一个点而抓狂呢?

你是否已经有了一些前端基础了解选择器却与另外一些奇怪的选择器语法混淆了呢?

嗯,那么,前端大大们的福音来了,PyQuery 来了,乍听名字,你一定联想到了 jQuery,如果你对 jQuery 熟悉,那么 PyQuery 来解析文档就是不二之选!包括我在内!

PyQuery 是 Python 仿照 jQuery 的严格实现。语法与 jQuery 几乎完全相同,所以不用再去费心去记一些奇怪的方法了。

天下竟然有这等好事?我都等不及了!

安装

有这等神器还不赶紧安装了!来!

​pip install pyquery

 还是原来的配方,还是熟悉的味道。

简介

pyquery allows you to make jquery queries on xml documents. The API is as much as possible the similar to jquery. pyquery uses lxml for fast xml and html manipulation.

This is not (or at least not yet) a library to produce or interact with javascript code. I just liked the jquery API and I missed it in python so I told myself “Hey let’s make jquery in python”. This is the result.

It can be used for many purposes, one idea that I might try in the future is to use it for templating with pure http templates that you modify using pyquery. I can also be used for web scrapping or for theming applications with Deliverance.

pyquery 可让你用 jQuery 的语法来对 xml 进行操作。这I和 jQuery 十分类似。如果利用 lxml,pyquery 对 xml 和 html 的处理将更快。

这个库不是(至少还不是)一个可以和 JavaScript交互的代码库,它只是非常像 jQuery API 而已。

初始化

在这里介绍四种初始化方式。

(1)直接字符串

​from pyquery import PyQuery as pq
doc = pq("<html></html>")

 pq 参数可以直接传入 HTML 代码,doc 现在就相当于 jQuery 里面的 $ 符号了。

(2)lxml.etree

​from lxml import etree
doc = pq(etree.fromstring("<html></html>"))

 可以首先用 lxml 的 etree 处理一下代码,这样如果你的 HTML 代码出现一些不完整或者疏漏,都会自动转化为完整清晰结构的 HTML代码。

(3)直接传URL

from pyquery import PyQuery as pq
doc = pq('http://www.baidu.com')

 这里就像直接请求了一个网页一样,类似用 urllib2 来直接请求这个链接,得到 HTML 代码。

(4)传文件

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

 可以直接传某个路径的文件名。

快速体验

现在我们以本地文件为例,传入一个名字为 hello.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(filename='hello.html')
print doc.html()
print type(doc)
li = doc('li')
print type(li)
print li.text()

 运行结果

​

    <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>
 
<class 'pyquery.pyquery.PyQuery'>
<class 'pyquery.pyquery.PyQuery'>
first item second item third item fourth item fifth item

​

 看,回忆一下 jQuery 的语法,是不是运行结果都是一样的呢?

在这里我们注意到了一点,PyQuery 初始化之后,返回类型是 PyQuery,利用了选择器筛选一次之后,返回结果的类型依然还是 PyQuery,这简直和 jQuery 如出一辙,不能更赞!然而想一下 BeautifulSoup 和 XPath 返回的是什么?列表!一种不能再进行二次筛选(在这里指依然利用 BeautifulSoup 或者 XPath 语法)的对象!

然而比比 PyQuery,哦我简直太爱它了!

属性操作

你可以完全按照 jQuery 的语法来进行 PyQuery 的操作。

​from pyquery import PyQuery as pq
 
p = pq('<p id="hello" class="hello"></p>')('p')
print p.attr("id")
print p.attr("id", "plop")
print p.attr("id", "hello")

 运行结果

​hello
<p id="plop" class="hello"/>
<p id="hello" class="hello"/>

 再来一发

from pyquery import PyQuery as pq
 
p = pq('<p id="hello" class="hello"></p>')('p')
print p.addClass('beauty')
print p.removeClass('hello')
print p.css('font-size', '16px')
print p.css({'background-color': 'yellow'})

 运行结果

​<p id="hello" class="hello beauty"/>
<p id="hello" class="beauty"/>
<p id="hello" class="beauty" style="font-size: 16px"/>
<p id="hello" class="beauty" style="font-size: 16px; background-color: yellow"/>

 依旧是那么优雅与自信!

在这里我们发现了,这是一连串的操作,而 p 是一直在原来的结果上变化的。

因此执行上述操作之后,p 本身也发生了变化。

DOM操作

同样的原汁原味的 jQuery 语法

​

from pyquery import PyQuery as pq
 
p = pq('<p id="hello" class="hello"></p>')('p')
print p.append(' check out <a href="http://reddit.com/r/python"><span>reddit</span></a>')
print p.prepend('Oh yes!')
d = pq('<div class="wrap"><div id="test"><a href="http://cuiqingcai.com">Germy</a></div></div>')
p.prependTo(d('#test'))
print p
print d
d.empty()
print d

​

 运行结果

​

<p id="hello" class="hello"> check out <a href="http://reddit.com/r/python"><span>reddit</span></a></p>
<p id="hello" class="hello">Oh yes! check out <a href="http://reddit.com/r/python"><span>reddit</span></a></p>
<p id="hello" class="hello">Oh yes! check out <a href="http://reddit.com/r/python"><span>reddit</span></a></p>
<div class="wrap"><div id="test"><p id="hello" class="hello">Oh yes! check out <a href="http://reddit.com/r/python"><span>reddit</span></a></p><a href="http://cuiqingcai.com">Germy</a></div></div>
<div class="wrap"/>

​

 这不需要多解释了吧。

DOM 操作也是与 jQuery 如出一辙。

遍历

遍历用到 items 方法返回对象列表,或者用 lambda

from pyquery import PyQuery as pq
doc = pq(filename='hello.html')
lis = doc('li')
for li in lis.items():
    print li.html()
 
print lis.each(lambda e: e)

 运行结果

​first item
<a href="link2.html">second item</a>
<a href="link3.html"><span class="bold">third item</span></a>
<a href="link4.html">fourth item</a>
<a href="link5.html">fifth item</a>
<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>

 不过最常用的还是 items 方法

网页请求

PyQuery 本身还有网页请求功能,而且会把请求下来的网页代码转为 PyQuery 对象。

from pyquery import PyQuery as pq
print pq('http://cuiqingcai.com/', headers={'user-agent': 'pyquery'})
print pq('http://httpbin.org/post', {'foo': 'bar'}, method='post', verify=True)

 感受一下,GET,POST,样样通。

分享到:
评论

相关推荐

    网络爬虫-多进程爬取在线课程并存入MySQL数据库-Python源码示例.zip

    该压缩包文件“网络爬虫-多进程爬取在线课程并存入MySQL数据库-Python源码示例.zip”提供了一个Python实现的网络爬虫项目,旨在通过多进程技术抓取在线课程信息,并将数据存储到MySQL数据库中。这个项目涵盖了以下几...

    核心基础-模拟生成福彩双色球彩票号码-Python源码示例.zip

    在本压缩包“核心基础-模拟生成福彩双色球彩票号码-Python源码示例.zip”中,包含了一个使用Python编程语言实现的程序,用于模拟生成中国福利彩票双色球的随机号码。这个程序展示了Python在自动化、数据分析、游戏...

    网络爬虫-爬取在线课程并保存到Excel-Python源码示例.zip

    在本压缩包中,我们关注的是使用Python进行网络爬虫技术来抓取在线课程信息,并将其整理存储到Excel文件中的过程。这个实例涉及到的主要知识点包括网络爬虫的基础、Python编程、网页解析以及数据处理和存储。 1. **...

    网络爬虫-如何实现实时显示下载的进度(百分比形式)-Python实例源码.zip

    总的来说,通过使用`urllib.request`和`tqdm`库,我们可以实现在Python网络爬虫中实时显示下载进度,提升用户体验。同时,爬虫技术与其他领域如游戏开发、数据分析和自动化紧密结合,展现了其在各种应用场景中的广泛...

    网络爬虫-如何去除文本信息中的干扰数据-Python实例源码.zip

    Python作为网络爬虫的常用语言,提供了丰富的库和方法来帮助我们完成这项任务。以下是一些关键知识点: 1. **BeautifulSoup库**:用于解析HTML和XML文档,可以方便地找到和提取网页中的特定元素。例如,我们可以...

    网络爬虫-如何获取网页中动态加载的验证码图片-Python实例源码.zip

    要获取动态加载的验证码图片,可以采取以下几种方法: 1. **模拟浏览器行为**:使用像Selenium这样的工具,它能够模拟真实浏览器的行为,包括执行JavaScript代码。Selenium支持多种浏览器,如Chrome、Firefox等。...

    芝麻Python

    "芝麻Python"是一个可能指的是入门或初级级别的Python学习资源,可能是某个课程、教程或学习项目的名称。这个资源可能旨在帮助初学者开启他们的Python编程之旅。Python是一种广泛使用的高级编程语言,以其简洁明了的...

    网络爬虫-如何实现定时爬取网页内容-Python实例源码.zip

    在IT领域,网络爬虫是一种自动化程序,用于从互联网上抓取信息,通常用于数据分析、市场研究或构建搜索引擎。在Python中实现定时爬取...结合上述方法,你可以构建自己的网络爬虫系统,高效地获取并处理互联网上的信息。

    程序自动化-连接MySQL数据库时自动开启服务器-Python实例源码.zip

    网络爬虫经常需要将抓取的数据存储到数据库中,Python的`requests`库用于发送HTTP请求,`BeautifulSoup`或`lxml`库解析HTML,然后使用MySQL存储数据。在Python脚本中,可以先启动MySQL服务,再进行爬虫数据的入库...

    Python源码实例-画爱心.zip

    在Python编程语言中,"画爱心"是一种常见的图形绘制练习,它可以帮助初学者熟悉Python的图形输出和控制结构。这个压缩包"Python源码实例-画爱心.zip"包含了一个具体的Python代码示例,用于在终端或命令行界面绘制出...

    Python源码实例-翻译软件.zip

    在本压缩包“Python源码实例-翻译软件.zip”中,包含的是一个使用Python编程语言实现的翻译软件的源代码示例。这个软件可能利用了Python的自动化特性,结合数据分析和网络爬虫技术,以便高效地进行文本翻译。此外,...

    Python源码实例-画画.zip

    在Python编程领域,"Python源码实例-画画.zip"这个压缩包文件似乎包含了一系列与使用Python进行图形绘制相关的源代码示例。这个压缩包可能是为了帮助初学者或开发者理解如何利用Python来创建视觉效果,包括可能的...

    Python源码实例-贺卡.zip

    6. **网络爬虫**:虽然不常见,但如果你的贺卡实例需要从网上抓取特定图片或信息,Python的网络爬虫技术(如BeautifulSoup和Scrapy)就派上用场了。这可以实现自动收集网络上的贺卡素材。 7. **游戏开发**:虽然...

    微信红包提醒-Python源码示例.zip

    在本压缩包“微信红包提醒-Python源码示例.zip”中,主要包含了一个使用Python编程语言实现的微信红包自动提醒的功能。这个功能对于经常参与微信红包活动的用户来说非常实用,可以避免错过任何红包机会。以下是这个...

    Gecco网络爬虫 v1.3.0.zip

    源代码是理解爬虫工作原理的关键,通过阅读和分析这些代码,我们可以学习到如何使用Python或其他编程语言(如Java或JavaScript)来编写网络爬虫。源代码通常会包含以下几个部分: 1. **请求模块**:负责发送...

    文件图形多媒体-用Python实现文件对比分析并生成报告-Python源码示例.zip

    Python的requests库用于发送HTTP请求,BeautifulSoup解析HTML和XML文档,scrapy是一个强大的爬虫框架,可以构建复杂的爬虫项目。 7. **报告生成**:Python的reportlab库可以生成PDF报告,Jinja2模板引擎则用于...

    Python源码实例-简易时钟.zip

    在本压缩包“Python源码实例-简易时钟.zip”中,包含了一个使用Python编程语言实现的简单时钟程序。这个实例主要展示了Python在自动化、数据分析、网络爬虫以及游戏开发等多个领域的应用潜力。让我们深入探讨一下这...

    核心基础-根据身份证号判断所属省份、生日及性别-Python源码示例.zip

    Python中可以使用字符串切片、正则表达式等方法来提取身份证号码中的信息。例如,通过索引获取特定位置的字符,或者使用正则表达式匹配特定模式(如出生日期格式)。 3. **日期处理**: Python的`datetime`模块...

    python实战项目源码-学生信息管理系统-含可执行文件.zip

    Python作为一种高级编程语言,因其简洁明了的语法和强大的功能,被广泛应用于各种领域,包括自动化、数据分析、网络爬虫和游戏开发等。本项目“Python实战项目源码-学生信息管理系统-含可执行文件”是一个典型的...

    网络爬虫-使用urretrieve模块实现直接远程下载图片-Python实例源码.zip

    `urretrieve`是一个简洁的Python库,它提供了方便的方法来下载文件,特别适合于爬虫项目中的文件下载需求。 首先,我们需要了解`urretrieve`的基本用法。`urretrieve`模块提供了一个简单的函数`retrieve(url, ...

Global site tag (gtag.js) - Google Analytics