本篇大部分转载于https://www.jianshu.com/p/c07f7cd1b548

先放自已自己解析techweb一个网站图片的代码

from pyquery import PyQuery as pq

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'} def get_info(url):
html = requests.get(url,headers =headers,verify=False)
d = pq(html.content)
doc = d("div").filter(".list_con")
doc = doc("div").filter(".picture_text")
for tr in doc.items():
temp =tr.find("img")
print(temp.attr("src")) if __name__ == "__main__":
get_info("http://mi.techweb.com.cn/")

前言

Python关于爬虫的库挺多的,也各有所长。了解前端的也都知道, jQuery 能够通过选择器精确定位 DOM 树中的目标并进行操作,所以我想如果能用 jQuery 去爬网页那就 cool 了。

就搜了下看 Python 有没有与 DOM 相关的库什么的,还真找到了—— PyQuery !

PyQuery简介

pyquery相当于jQuery的python实现,可以用于解析HTML网页等。它的语法与jQuery几乎完全相同,对于使用过jQuery的人来说很熟悉,也很好上手。

引用作者的原话就是:

“The API is as much as possible the similar to jquery.” 。

安装

使用 pip 或者 easy_install 都可以。
注意:由于 pyquery 依赖于 lxml ,要先安装 lxml ,否则会提示失败。

  1. 安装lxml:https://pypi.python.org/pypi/lxml/2.3/ (建议直接下载安装包,方便快捷);
  2. 安装pyquery:easy_install pyquery 或者pip install pyquery;
  3. 验证:输入 import pyquery 回车不报错即安装成功;

初始化

有 4 种方法可以进行初始化:
可以通过传入 字符串、lxml、文件 或者 url 来使用PyQuery。

from pyquery import PyQuery as pq
from lxml import etree d = pq("<html></html>")#传入字符串
d = pq(etree.fromstring("<html></html>"))#传入lxml
d = pq(url='http://google.com/') #传入url
d = pq(filename=path_to_html_file) #传入文件

现在,d 就像 jQuery 中的 $ 一样了。

示例

通过一个简单的例子快速熟悉 pyquery 的用法,传入文件 example.html,内容如下:

<div>
<tr class="item-0">
<td>first section</td>
<td>1111</td>
<td>17-01-28 22:51</td>
</tr>
<tr class="item-1">
<td>second section</td>
<td>2222</td>
<td>17-01-28 22:53</td>
</tr>
</div>

python 程序:

# -*- coding: utf-8 -*-
from pyquery import PyQuery as pq#引入 PyQuery doc = pq(filename='example.html')# 传入文件 example.html print doc.html() # html()方法获取当前选中的 html 块 print doc('.item-1') # 相当于 class 选择器,选取 class 为 item-1 的 html 块 data = doc('tr') # 选取 <tr> 元素 for tr in data.items():# 遍历 data 中的 <tr> 元素
temp = tr('td').eq(2).text() # 选取第3个 <td> 元素中的文本块
print temp

运行结果:

# print doc.html()
<tr class="item-0">
<td>first section</td>
<td>1111</td>
<td>17-01-28 22:51</td>
</tr>
<tr class="item-1">
<td>second section</td>
<td>2222</td>
<td>17-01-28 22:53</td>
</tr> # print doc('.item-1')
<tr class="item-1">
<td>second section</td>
<td>2222</td>
<td>17-01-28 22:53</td>
</tr> # print tr('td').eq(2).text()
17-01-28 22:51
# print tr('td').eq(2).text()
17-01-28 22:53

操作

1、.html() 和.text():获取相应的 HTML 块或者文本内容,

p=pq("<head><title>Hello World!</title></head>")

print p('head').html()# 获取相应的 HTML 块
print p('head').text()# 获取相应的文本内容 '''输出:
<title>hello</title>
Hello World!
'''

2、.('selector'):通过选择器来获取目标内容,

d = pq("<div><p id='item-0'>test 1</p><p class='item-1'>test 2</p></div>")

print d('div').html()# 获取 <div> 元素内的 HTML 块
print d('#item-0').text()# 获取 id 为 item-0 的元素内的文本内容
print d('.item-1').text()# 获取 class 为 item-1 的元素的文本内容 '''输出:
<p id="item-0">test 1</p><p class="item-1">test 2</p>
test 1
test 2
'''

3、.eq(index):根据索引号获取指定元素(index 从 0 开始),

d = pq("<div><p id='item-0'>test 1</p><p class='item-1'>test 2</p></div>")

print d('p').eq(1).text()# 获取第二个 p 元素的文本内容,

'''输出
test 2
'''

4、.find():查找嵌套元素,

d = pq("<div><p id='item-0'>test 1</p><p class='item-1'>test 2</p></div>")

print d('div').find('p') # 查找 <div> 内的 p 元素
print d('div').find('p').eq(0) # 查找 <div> 内的 p 元素,输出第一个 p 元素 '''输出:
<p id="item-0">test 1</p><p class="item-1">test 2</p>
<p id="item-0">test 1</p>
'''

5、.filter():根据 class、id 筛选指定元素,

d = pq("<div><p id='item-0'>test 1</p><p class='item-1'>test 2</p></div>")

print d('p').filter('.item-1') # 查找 class 为 item-1 的 p 元素
print d('p').filter('#item-0') # 查找 id 为 item-0 的 p 元素 '''输出:
<p class="item-1">test 2</p>
<p id="item-0">test 1</p>
'''

6、.attr():获取、修改属性值,

d = pq("<div><p id='item-0'>test 1</p><a class='item-1'>test 2</p></div>")

print d('p').attr('id') # 获取 <p> 标签的属性 id
print d('a').attr('class','new')# 修改 <a> 标签的 class 属性为 new '''输出:
item-0
<a class="new">test 2</a>
'''

7、其他操作:
.addClass(value):添加 class;
.hasClass(name):判断是否包含指定的 class,返回 True 或 False;
.children():获取子元素;
.parents():获取父元素;
.next():获取下一个元素;
.nextAll():获取后面全部元素块;
.not_('selector'):获取所有不匹配该选择器的元素;
for i in d.items('li'): print i.text():遍历 d 中的 li 元素;

结语

以上的操作对于日常爬取一些小数据资料,基本足够使用了。当然,PyQuery 还有很多其他内容,这里就不做说明了,如果需要了解更多关于 PyQuery 的内容的可以去查看官方文档。

官方文档是英文的,但也比较容易阅读和理解。我找到了一个中文的教程网站,这里也提供出来。

官方文档:https://pythonhosted.org/pyquery/index.html#
中文教程:http://www.geoinformatics.cn/lab/pyquery/

python解析HTML之:PyQuery库的介绍与使用的更多相关文章

  1. PYTHON 爬虫笔记六:PyQuery库基础用法

    知识点一:PyQuery库详解及其基本使用 初始化 字符串初始化 html = ''' <div> <ul> <li class="item-0"&g ...

  2. Python解析HTML的开发库pyquery

    PyQuery是一个类似于jQuery的Python库,也可以说是jQuery在Python上的实现,能够以 jQuery 的语法来操作解析 HTML 文档,易用性和解析速度都很好. 例如,一段豆瓣h ...

  3. 深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  4. Python中PyQuery库的使用总结

    介绍 pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,官方文档地址是:http://packages.python.org/pyquery/ pyquery 可让你用 ...

  5. Python常用的库简单介绍一下

    Python常用的库简单介绍一下fuzzywuzzy ,字符串模糊匹配. esmre ,正则表达式的加速器. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable ...

  6. python 标准库和第3方库的介绍

    忘了从哪里来的了~~~~ Tkinter———— Python默认的图形界面接口.Tkinter是一个和Tk接口的模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组.T ...

  7. python爬虫从入门到放弃(七)之 PyQuery库的使用

    PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...

  8. https学习笔记二----基础密码学知识和python pycrypto库的介绍使用

    在更详细的学习HTTPS之前,我也觉得很有必要学习下HTTPS经常用到的加密编码技术的背景知识.密码学是对报文进行编解码的机制和技巧.可以用来加密数据,比如数据加密常用的AES/ECB/PKCS5Pa ...

  9. Python爬虫-- PyQuery库

    PyQuery库 PyQuery库也是一个非常强大又灵活的网页解析库,PyQuery 是 Python 仿照 jQuery 的严格实现.语法与 jQuery 几乎完全相同,所以不用再去费心去记一些奇怪 ...

随机推荐

  1. TensorFlow-多层感知机(MLP)

    TensorFlow训练神经网络的4个步骤: 1.定义算法公式,即训练神经网络的forward时的计算 2.定义损失函数和选择优化器来优化loss 3.训练步骤 4.对模型进行准确率评测 附Multi ...

  2. PIE SDK位深转换

      1.算法功能简介 位深转换功能是一种用于更改一个给定输入文件数据范围的灵活方法.可以完全控制输入和输出直方图,以及输出数据类型(字节型.整型.浮点型等). PIE支持算法功能的执行,下面对位深转换 ...

  3. Epplus导出Excel(DataTable)

    1.先将dataTable转换成流 public Stream DataTableToExcel(DataTable dataTable, string[] columns, string sheet ...

  4. python 管理多版本之pyenv

    一, [root@management ~]# pyenv install -listAvailable versions:  3.3.0  3.3.1  3.3.2  3.3.3  3.3.4  3 ...

  5. Linux Nginx环境安装配置redmine3.1

    作者博文地址:https://www.cnblogs.com/liu-shuai/ 环境: CentOS-6.5+Nginx-1.8.0+Redmine-3.1.1+Ruby-2.0 1.配置环境 1 ...

  6. 案例45-crm练习改写客户列表使用struts2&OGNL

    1 修改CustomerAction代码 2 修改jsp/customer/list.jsp代码 <%@ page language="java" contentType=& ...

  7. JS中彻底删除json对象组成的数组中的元素

    只是分享一个小知识~ 在JS中,对于某个由json对象组成的数组,例如: var test = [{ "a": "1", "b": &quo ...

  8. roboframework-ride运行案例时报 Error 267 错误问题

    偶然间碰到这个问题,检查下路径是否有中文,如有中文换成英文试试. (ps:通常自己创建的中文路径也是可以的,我的案例是从Linux环境中创建拷贝过来的,可能导致案例路径编码问题)

  9. sqlserver 限制用户只能访问指定的视图

    项目中有一个需求,要求给其它单位提供数据,我们用到了视图,并要求不能让他们看到数据库中的其它数据,我们为其创建了单独的账号,并只能看到指定视图 一.创建视图 CREATE VIEW [dbo].[v_ ...

  10. PowerDesigner从SqlServer数据库导入数据模型

    Powerdesigner 从数据库导入数据 第一步, 打开 powerdesigner, 在菜单选择 [File] 选项, 然后在弹出的下拉单中选择 [Reverse Engineer]选项,再选择 ...