1 pyquery

简介:同样是一个强大的网页解析工具 它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便

2 pyquery基本用法

2.1 安装

pip install pyquery

2.2 初始化

字符串初始化

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

print(doc('li'))

first itemsecond itemthird itemfourth itemfifth item

URL初始化

from pyquery import PyQuery as pq

doc = pq(url='http://www.baidu.com')

print(doc('head'))

ç�¾åº¦ä¸�ä¸�ï¼�ä½ å°±ç�¥é��

文件初始化

from pyquery import PyQuery as pq

doc = pq(filename='test.html')

print(doc('li'))

11111111112222222222333333333344444444445555555555

2.3 基本CSS选择器

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

print(doc('#container .list li'))

first itemsecond itemthird itemfourth itemfifth item

2.4 查找元素

2.4.1 子元素

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

items = doc('.list')

print(type(items))

print(items)

lis = items.find('li')

print(type(lis))

print(lis)

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

first itemsecond itemthird itemfourth itemfifth item

lis = items.children()

print(type(lis))

print(lis)

first itemsecond itemthird itemfourth itemfifth item

lis = items.children('.active')

print(lis)

third itemfourth item

注意:这里的item-0和active是两个类,在html中可以给同一元素设置两个类,中间用空格隔开

2.4.2 父元素

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

items = doc('.list')

container = items.parent()

print(type(container))

print(container)

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

items = doc('.list')

parents = items.parents()

print(type(parents))

print(parents)

  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • first item
  • second item
  • third item
  • fourth item
  • fifth item

parent = items.parents('.wrap')

print(parent)

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

2.4.3 兄弟元素

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

li = doc('.list .item-0.active')

print(li.siblings())

second itemfirst itemfourth itemfifth item

可以看到,结果的顺序并不是完全和输入的顺序一致

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

li = doc('.list .item-0.active') # 表示class为list的元素下的元素,这个元素的class为item-0和active

print(li.siblings('.active'))

fourth item

2.5 遍历

单个元素

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

li = doc('.item-0.active')

print(li)

third item

多个元素

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

lis = doc('li').items()

print(type(lis))

for li in lis:

print(li)

first itemsecond itemthird itemfourth itemfifth item

2.6 获取信息

获取属性

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

a = doc('.item-0.active a')

print(a)

print(a.attr('href'))

print(a.attr.href)

third item

link3.html

link3.html

获取文本

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

a = doc('.item-0.active a')

print(a)

print(a.text())

third item

third item

获取HTML

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

li = doc('.item-0.active')

print(li)

print(li.html())

third item

third item

2.7 DOM操作

addClass、removeClass

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

li = doc('.item-0.active')

print(li)

li.removeClass('active')

print(li)

li.addClass('active')

print(li)

third itemthird itemthird item

attr、css

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

li = doc('.item-0.active')

print(li)

li.attr('name', 'link')

print(li)

li.css('font-size', '14px')

print(li)

third itemthird itemthird item

remove

html = '''

Hello, World

This is a paragraph.

'''

from pyquery import PyQuery as pq

doc = pq(html)

wrap = doc('.wrap')

print(wrap.text())

wrap.find('p').remove()

print(wrap.text())

Hello, World

This is a paragraph.

Hello, World

2.8 伪类选择器

html = '''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

from pyquery import PyQuery as pq

doc = pq(html)

li = doc('li:first-child')

print(li)

li = doc('li:last-child')

print(li)

li = doc('li:nth-child(2)')

print(li)

li = doc('li:gt(2)')# index > 2 的所有子元素,从0开始

print(li)

li = doc('li:nth-child(2n)')

print(li)

li = doc('li:contains(second)') # 根据文本选择

print(li)

first itemfifth itemsecond itemfourth itemfifth itemsecond itemfourth itemsecond item

3 实战---爬取百度校花吧(pyquery版)

import requests

from lxml import etree

import os

from pyquery import PyQuery as pq

class Baidu(object):

def __init__(self, name):

self.url = 'http://tieba.baidu.com/f?ie=utf-8&kw={}'.format(name)

# 使用较老版本的请求头,该浏览器不支持js

self.headers = {

'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) '

}

# 发送请求,获取响应

def get_data(self, url):

response = requests.get(url,headers=self.headers)

return response.content

# 解析列表页数据,获取列表页面帖子的标题和链接

def parse_list_page(self, data):

with open('baidu1.html','wb') as f:

f.write(data)

# 实例化etree对象

# html = etree.HTML(data).

doc = pq(data)

node_list= doc.find('.j_thread_list .threadlist_title a')

# 使用xpath语法,提取网页数据

# node_list = html.xpath("//*[@id='thread_list']/li[@class=' j_thread_list clearfix']/div/div[2]/div[1]/div[1]/a")

# 判断获取结果

# print(len(node_list))

data_list = []

# 遍历node_list

for node in node_list.items():

temp = {}

temp['url'] = 'http://tieba.baidu.com' + node.attr('href')

temp['title'] = node.text()

data_list.append(temp)

# 提取下一页的节点

next_node = doc.find('#frs_list_pager .next').attr('href')

# next_node = html.xpath('//*[@id="frs_list_pager"]/a[last()-1]/@href')[0]

# print(next_node)

# 拼接下一页的完整url

next_url = 'http:' + next_node

# print(next_url)

return data_list,next_url

def parse_detail_page(self, data_list):

html = etree.HTML(data_list)

doc = pq(data_list)

# 提取详情页面的图片链接

imagelst = doc.find('.BDE_Image').items()

image_list = [img.attr('src') for img in imagelst]

# image_list = html.xpath("//cc/div[contains(@class,'d_post')]/img[@class='BDE_Image']/@src")

# 返回图片节点列表

print(image_list)

return image_list

# 下载图片,保存图片文件

# 创建文件夹

def download(self, image_list):

if not os.path.exists('images1'):

os.makedirs('images1')

for image in image_list:

# os.sep在mac系统中是/,如果是windows系统,\\,跨平台

file_name = 'images1'+ os.sep + image.split('/')[-1]

image_data = self.get_data(image)

with open(file_name,'wb') as f:

f.write(image_data)

def run(self):

# 构造url和请求头

# 发送请求,获取响应

next_url = self.url

# 开启循环,

while next_url:

data = self.get_data(next_url)

# 解析列表页数据,返回的列表数据、下一页的的数据

data_list,next_url = self.parse_list_page(data)

# 解析详情页的数据,获取详情页的图片的链接地址

for data in data_list:

url = data['url']

result_list = self.get_data(url)

image_list = self.parse_detail_page(result_list)

# 保存数据,下载图片

self.download(image_list)

if __name__ == '__main__':

# 爬取百度校花吧所有图片并存在文件夹中

baidu = Baidu('校花吧')

baidu.run()

python爬虫科研数据提取_python爬虫数据提取四之pyquery相关推荐

  1. python win32ui选取文件夹_Python爬虫基础之认识html和学习数据提取(上)

    我:我已经学会了基本的python,接下来可以学什么鸭? 惨绿青年:接下来可以学习制作python爬虫了,但还是需要学习相关的知识. 我:什么知识鸭? 惨绿青年:网页的相关知识.我们看到的网页一般是h ...

  2. python爬取网页数据软件_python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  3. python数据入库_python爬虫(中)--数据建模与保存(入库)

    前言 前面,讲的是提取出来的数据保存进一个extracted_data,再保存进extracted_data_,变成一个list包含list的情况,当然你只提取一项,那就没有必要这么做了,可是我的项目 ...

  4. python爬虫网络数据包_Python爬虫之多线程图虫网数据爬取(十六)

    Python爬虫之多线程图虫网数据爬取(十六) 发布时间:2019-05-14 10:11, 浏览次数:289 , 标签: Python 原创不易,转载前请注明博主的链接地址:Blessy_Zhu h ...

  5. python监控服务器信息进行可视化_Python实现数据可视化,看如何监控你的爬虫

    好,开始今天的文章. 今天主要是来说一下怎么可视化来监控你的爬虫的状态. 相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样.今天我来讲一种可视化 ...

  6. python爬虫实现股票数据存储_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储!...

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  7. python爬取收费素材_Python爬虫练习:爬取素材网站数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在工作中的电子文案.ppt,生活中的新闻.广告,都离不开大量的素材,而素材 ...

  8. python爬取网页数据流程_Python爬虫爬取数据的步骤

    爬虫: 网络爬虫是捜索引擎抓取系统(Baidu.Google等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 步骤: 第一步:获取网页链接 1.观察需要爬取的多 ...

  9. python爬取数据步骤_Python爬虫爬取数据的步骤

    爬虫: 网络爬虫是捜索引擎抓取系统(Baidu.Google等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 步骤: 第一步:获取网页链接 1.观察需要爬取的多 ...

  10. pythonjson数据提取_python爬虫学习笔记(十)-数据提取之JsonPath的使用

    1. JSON与JsonPATH JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于 ...

最新文章

  1. 使用jQuery的.css()和.attr()方法设置元素left属性的注意点
  2. RuntimeError: dictionary changed size during iteration 解决办法
  3. 【转】 指针函数与函数指针的区别
  4. Java 设计模式之外观模式
  5. Angular Schematics 学习笔记
  6. SAP Fiori Application Generator 在 Visual Studio Code 启动时遇到的错误消息
  7. Java SAO操作-使用lambda代替字符串
  8. 传说中的神器: shared_ptr/weak_ptr/scoped_ptr
  9. python爬取景点数据看该去哪里玩——南京篇
  10. 一次数学分析的教学(依然进行中)
  11. Windows NTP 服务器配置及开启
  12. Android如何制作本地音乐播放器,简单实现Android本地音乐播放器
  13. 工业机器人实训系统(鼠标装配)
  14. 遗传算法及其应用_遗传算法及其广泛应用
  15. [150529](必看)档案挂靠与打回生源地、暂缓的对比 (广州)
  16. 同一操作系统中安装多个不同版本谷歌Chrome浏览器
  17. POJ 3080 Blue Jeans(KMP + 暴力)
  18. 兵卒情缘酒新品上市发布会
  19. java jacob更新目录,jacob更新word目录
  20. python实现微信发红包

热门文章

  1. JEESZ-SSO解决方案
  2. 《食堂远程下单系统》设计规格说明书
  3. HBase源码分析之HRegion上compact流程分析(三)
  4. [C++] STACK_Principle
  5. C与C++在const用法上的区别
  6. Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库
  7. 基于Windows Server 2008 R2的WSFC实现SQL Server 2012高可用性组(AlwaysOn Group)
  8. 【python自动化办公02】word操作-word转pdf
  9. elementui el-drawer去除自带黑色边框、允许滚动(亲测有效)
  10. Draft-微软出品的云原生下的本地开发辅助工具