python课程设计笔记(五) ----Resuests+BeautifulSoup (爬虫入门)
官方参考文档(中文版):
requests:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
beautifulsoup:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
这篇博客只是简单介绍思路,建议直接阅读上面的官方文档
目标
从一个HTML或XML文件中提取数据,节省人工的时间。我这里提取一个html页面(https://www.zxzhijia.com/tuce/f1301_h_m )的所有图片。
需要安装的:requests 和 beautifulsoup,lxml解析器
- requests 安装: pip install requests
- beautifulsoup 安装:pip install beautifulsoup4
- lxml解析器安装:pip install lxml
requests: 获取某个URL的内容。(这里只用到了获取HTML的内容)
Beautiful Soup :从HTML或XML文件中提取数据。
lxml解析器:beautifulsoup提取数据时用到。
requests获得的HTML内容要用lxml解析,用BeautifulSoup提取。
效果演示:
爬取的HTML页面:https://www.zxzhijia.com/tuce/f1301_h_m,要爬取七张装修案例的图片,把图片路径放入MySQL数据库
#爬取装修图片
import requests
import re #正则表达式from bs4 import BeautifulSoup #利用requests获取html网页内容
res=requests.get("https://www.zxzhijia.com/tuce/f1301_h_m")
#传给beautifulsoup,指定用lxml解析器解析
soup = BeautifulSoup(res.text, 'lxml') #获得指定7个img图像
img_src=soup.find(name='div',class_='waterfall').findAll(name="img",src=re.compile("img"),limit=7) for img in img_src:
img=img['src'] #抓取src属性的属性值(图片的href)print(img)
详解beautifulsoup的作用:
res=requests.get("https://www.zxzhijia.com/tuce/f1301_h_m")
soup = BeautifulSoup(res.text, 'lxml')
这两句之后soup里面就有html的内容了。
BeautifulSoup会将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment。
树形结构很关键,比如一段这样的html,(下面都以这段为例):
<html>
<head>
<title>测试界面</title>
</head>
<body>
<div>
<ul class="c">
<li class="c">beautifulsoup</li>
<li><span>span里面的字</span>span外的字</li>
<li><a href="#">链接</a></li>
</ul>
</div>
</body>
beautifulsoap会生成文档树,我把它画出来 了:
(直接从ul开始画)--就已经这么麻烦了
一个红框称为一个节点!!仔细看字符串也是一个节点!!
分析文档树中的节点(红框框):
- Tag类型:是最普通的节点,看图中这些,一个框叫一个Tag对象,不是”a””div”。看最上面的这个Tag对象,它的name(名字)是“ul”,它拥有的attributes(属性)是“class”,而这个属性的值为“c”。
- NavigableString类型:普通字符串也一种节点类型。
- BeautifulSoup 类型:表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象。就是一个HTML转换成树以后最上方的节点,比<html>..</html>还高。
- Comment类型:注释,不多讲。
操作和遍历一个Tag对象的子节点
Beautiful Soup提供了许多操作和遍历子节点的属性。
1 获取单个Tag对象
获取单个tag: tag = soup.tag的名字 ----------这种方法只取当前名字的第一个Tag
import requests from bs4 import BeautifulSoup response=requests.get("http://localhost/test/test.html") soup = BeautifulSoup(response.text, 'lxml') tag=soup.li print(tag.name) #li
print(tag.string)
#beautifulsoup
获取单个tag对象里面的子tag对象: soup.tag名.tag名
2 获取一堆tag对象,用find_all()方法 !!注意,返回的时子节点列表,获得tag对象或navigatestring对象需要遍历这个列表
find_all( name , attrs , recursive , text , **kwargs )
搜索当前tag的所有tag子节点,并判断是否符合条件,返回的是一堆子节点。
name:tag的名字,可以是字符串('a')、正则表达式(了解re的使用),列表['a','div'],或者 True(全部) .
attrs={‘属性名a’,‘属性值b’} :搜索子节点中拥有属性a,且a="b"的。
一般写法:可以直接写成 属性名a=‘属性值b’ id='aaa' ,多个时用”,”隔开就可以。
对于css属性class 需要写成 _class="名称",这样单个多个都可以匹配。 不能写成class=" ",因为”class"时python保留字会有语法错误,写成attrs 时,如果class=“a b" ,就算只想搜索a,也必须写{”class":"a b"}才能搜索到这个tag,必须要完全匹配,所以不适合这么写。
text :tag里面夹的string内容,soup.find_all(text=["Tillie", "Elsie", "Lacie"])
limit:可以使用 limit 参数限制返回结果的数量。当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果。文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量:
soup.find_all("a", limit=2)
recursive:调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False
tag=soup.find_all("li")
tag=soup.find_all(re.compile("l"))
tag=soup.find_all(name='li',class_='c')
tag=soup.find_all('li',attrs={'class','c'})
tag=soup.find_all(True)
tag=soup.fine_all('li',limit=2)
find()方法:!!注意,获得的是一个子节点,就是tag对象或navigatestring对象,可以直接使用.name .string ['属性名']
用法和find_all方法一样。唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果.
3 获取tag对象的属性值和tag对象里面的字符串内容(<div>XXX</div>中的XXX)
属性值:
tag['属性名']
字符串内容:
.string
一个tag对象中间的字符串,可以直接tag.string
如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点:tag.string
如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果相同.
如果tag有超过一个子节点就不能直接.string,只会输出None
举例:遍历find_all()获得的list:
tags=soup.find_all('li')
for item in tags:
print(item.string) #beautifulsoup
#None
#链接
4 遍历一个tag对象的所有子节点
.contents 一个tag对象的所有直接子节点组成的list
循环遍历直接子节点 .children
for child in tag.children: print(child)
循环遍历所有子节点 .descendants
for child in tag.descendants:
print(child)
python课程设计笔记(五) ----Resuests+BeautifulSoup (爬虫入门)的更多相关文章
- python课程设计笔记(四)整数、浮点数与字符串 time库
整数类型(范围无限制) 十进制1 -1 二进制0b1 -0b1 八进制0o1 -0o1 十六进制0x1 -0x1 浮点类型(范围有限制但可忽略) 运算存在不确定尾数 :0.1+0.2!=0.3 原因: ...
- python课程设计笔记(三)turtle绘图库(海龟库)
实例:绘制一条蟒蛇 #turtle:绘图库(海龟库) import turtle turtle.setup(650,350,200,200) turtle.penup() turtle.fd(-250 ...
- python课程设计笔记(二)破冰基本语法
python两种编程方式:交互式与文件式 交互式:语法练习,输一条运行一条 文件式:通用,执行一组语句 注释 #单行注释 ...XXXXX...多行注释 逻辑 没有大括号,按缩进确定逻辑——缩进格数 ...
- python课程设计笔记(一)开发环境配置
今天开始学python,一个月后交成果?还是希望自己不要浮躁,认真地去学,有所付出也不期望太大回报. 现在还是一脸懵逼的状态,看着教程一点点来吧= = 毕竟我是最棒的最发光的阳光彩虹小白马! 1. 去 ...
- Python课程设计 搭建博客
安装包Github地址 Python综合设计 233博客 注意还有个email文件是需要填入自己信息的,比如最高权限账号和要发送邮件的账号密码 请安装Python2.7环境,本服务器所用环境为 设置环 ...
- Android课程设计第五天欢迎界面(滑动)和图形选择
注意:课程设计只为完成任务,不做细节描述~ 滑动界面 package com.example.myapplication; import android.content.Intent; import ...
- Python强化训练笔记(五)——找出多个字典中的公共键
在这个问题中,我们期望得到的结果是找到这三轮比赛中,每轮都进球的球员都有谁.下面用python来模拟一下,先生成一批数据: >>> from random import randin ...
- 【Python】学习笔记五:缩进与选择
Python最具特色的用缩进来标明成块的代码 缩进 i = 4 j = 2 if i > j: i = i+1 print(i) 这是一个简单的判断,Python的if使用很简单,没有括号等繁琐 ...
- python课程设计--学生管理系统
系统要求 1.添加学生 2.删除学生 3.修改学生信息 4.查询学生 5.查看所有学生信息 6.学生信息数据的存储与读取 源码:student.py #coding:utf-8 2 #定义学员类 3 ...
随机推荐
- 我的最爱Lambda演算——开篇
(在这个帖子的原始版本里,我试图用一个JavaScript工具来生成MathML.但不太顺利:有几个浏览器没法正确的渲染,在RSS feed里也显示的不好.所以我只好从头开始,用简单的文本格式重新写一 ...
- Apex语言(七)集合
1.集合 集合是可以存储多个记录数的变量类型. List列表集合可以包含任何数量的数据,与数组类似. Set列表集合包含多个无序的唯一记录数,集合不能具有重复记录,与列表类似. Map地图是一个键值对 ...
- Webpack 快速上手(下)
杏仁前端开发工程师,代码洁癖症早期,关注前端技术. 由于文章篇幅较长,为了更好的阅读体验,本文分为上.中.下三篇: 上篇介绍了什么是 webpack,为什么需要 webpack,webpack 的文件 ...
- Javaweb 使用Servlet技术改写用户登录 使用Filter技术解决中文乱码
先把实验3的jsp页面复制过来: WebContent->WEB-INF->lib下面的jar包8.0版本也要记得复制: Java Resources->src下的 cn.edu.h ...
- 【转载】Java 反射详解
目录 1.什么是反射? 2.反射能做什么? 3.反射的具体实现 4.根据反射获取父类属性 4.反射总结 反射反射,程序员的快乐! 1.什么是反射? Java反射就是在运行状态中,对于任意一个类,都能够 ...
- PAT_A1126#Eulerian Path
Source: PAT A1126 Eulerian Path (25 分) Description: In graph theory, an Eulerian path is a path in a ...
- C#第十一节课
类 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Thr ...
- 了解CSS overflow属性 标签: htmlcss属性 2016-12-31 14:38 75人阅读 评论(1)
overflow属性规定当内容溢出元素框时如何显示. 例:div { width:150px; height:150px; overflow:scroll; } 可能的值有: 值 ...
- MySQL 复制 - 性能与扩展性的基石:概述及其原理
原文:MySQL 复制 - 性能与扩展性的基石:概述及其原理 1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他 ...
- 为什么pthread_cond_wait须要传递mutex參数
这是来自知乎的一个问题,由@吴志强提出,有意思的是,他看了大家的回答后,突然顿悟了,同一时候也发现有人答错了,于是乎.他自己回答了自己的问题. 我看完后.发现他分析的非常精彩,于是就记录在这.以下是他 ...