好友
阅读权限10
听众
最后登录1970-1-1
|
王大哈哈
发表于 2021-1-7 12:30
大家好,在领导的压迫之下,我还是偷摸总结了以下我上午所学的知识!
昨天学习了 urllib.request()函数来请求网站并且适当的伪装了那么一下下。
今天就将昨天所爬取到的数据进行提炼,把需要的数据呢,进行提取出来。
在上一篇帖子中,我们爬取了网页的源代码,但是我发现,源代码中虽然有我需要的数据吧!
可是,你给我的没用的东西太多了。我要你那么多html标签干啥。又不能当饭吃,也不能当钱花。
更生气的是,我还不能有脾气!!!!谁让规矩是死的呢!
既然你不给我现成的,那我就只能自己去找我想要得了!
在这么多数据中,想要靠自己去找我们需要的数据,简直就是大海捞针。
那么,在word中有查找功能,是不是python也有一些可以查找功能的库。
然后,我就学习了 re库 和 bs4库中的BeautifulSoup()
这两个吧可气的是都能查找一定的数据,
But,我们总要选择一个合适的吧,
这时!正则表达式闪亮登场!!
其实学过java python 等等的编程语言的hxd们都知道正则表达式,学会了它,好多语言都通用
正则表达式:“老子通杀!!!!”
使用正则表达式了,那么就需要我们的re库了。
那么re库需要了解一下常用的函数
常用函数:
函数 | 说明 | 返回类型 | re.search() | 在一个字符串中搜索匹配的正则表达式的第一个位置 | 返回match对象 | re.match() | 从一个字符串的开始位置起,匹配正则表达式 | 返回match对象 | re.findall() | 搜索字符串,以列表类型返回全部能匹配的子串(子串就是字符串中查找到的数据) | 返回列表类型 | re.split() | 将一个字符串按照正则表达式分割 | 返回列表类型 | re.finditer() | 搜索字符串,返回一个匹配结果的迭代类型 | 每个迭代元素match对象 | re.sub() | 在一个字符串中替换所有匹配的正则表达式的字串 | 返回替换后的字符串 |
了解完常用函数,在了解一下什么是正则表达式,看表
字符 | 表示意思 | 案例 | [^] | 非字符集,对单个字符给出取值范围 | [^abc] 表示非abc | * | 前一个字符0次或者无限次扩展 | abc*表示ab,abc,abcc,abccc(无限次) | + | 前一个字符1次或者无限次扩展 | abc+表示abc,abcc,abccc | ? | 前一个字符0次或者一次扩展 | abc?表示ab,abc | | | 左右表达式任意一个 | abc | def 表示 abc 和 def随便那个都行 | {m} | 扩展前一个字符m次 | ab{2}c表示abbc | {m.n} | 扩展前一个字符m到n次(注意:包含n) | ab{1,2}表示abc,abbc | ^ | 匹配字符串开头 | ^abc 表示abc在一个字符串的开头 | $ | 匹配字符串结尾 | abc$表示abc在一个字符串的结尾 | () | 分组标记 | (abc) 表示 abc | \d | 所有数字【0-9】 | | \w | 所有单词字符【A-Za-z0-9】 | | [ ] | 字符集对单个字符给出的取值范围 | [abc]表示abc | . | 表示任何一个单个字符 | [a.z]表示a到z个 |
当时我看到这些东西,内心想,这都是些啥玩意,
用了之后才知道。真香!!
光说不练假把式!
上菜!
[Python] 纯文本查看 复制代码 #-*- codeing = utf-8 -*-
import urllib.request,urllib.error
from bs4 import BeautifulSoup
import re
findLink = re.compile(r'<a href="(.*?)">')
def askURL(url):
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
req = urllib.request.Request(url,headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
return html
def getData(url):
getlist = []
for i in range(1):
newurl = url+str(i*25)
html = askURL(newurl)
#解析数据
suop = BeautifulSoup(html,'html.parser')
for item in suop.find_all('div',class_="item"):
item = str(item)
link = re.findall(findLink,item)[0]
print(link)
return getlist
url = "https://movie.douban.com/top250?start="
getData(url)
这段代码的作用主要是爬取豆瓣网前250个电影的链接,
来解读一下代码:
我们看这句代码:findLink = re.compile(r'<a href="(.*?)">')
re.compile()函数 个人理解就是 将我们设置的正则表达式起个名字进行封装,后面调用方便
我们看函数里面的内容:
r'<a href="(.*?)">'
r在字符串前面 就是告诉我们的程序,什么“\',\\”这些转义字符统统别给我执行。
无论你出身贵贱,统统都是字符串!嘿嘿!
再看getData()这个函数:
for循环的主要作用就是翻页用的,顺带手的吧每页所需要的内容提出出来。
再来看这句代码:
soup = BeautifulSoup(html,'html.parser')
这句代码的使用到了BeautifulSoup()函数
个人理解:就是把我们网页源代码“html”传入进去,添加“html.parser”参数
告诉BeautifulSoup你在解析的时候注意一下,我这是个html的网页代码。就这么简单。
然后封装到soup中
嵌套的for循环呢 看图:
一个网页中有25个电影,我都需要看,所以都给他们提取出来.
suop.find_all('div',class_="item")
这句代码的意思就去查找一个div标签,类名为“item”的div标签获取它的数据
那 'div',class_="item" 怎么来的呢。看图:
从图中可以看到 我们需要的电影的各种信息都在这个div中,
那真是太棒了,我们将这个div从我们爬取的页面中在提取出来。
使用定义的findLink这个正则表达式去匹配刚爬取的这段div的信息!
接下来使用re.findall()函数对他进行查找
首先告诉findall我们使用的规则是findLink ,你用这个规则在item中给我找到对应的数据。
至于【0】是怕查出多条相同的链接,我们只要第一条就好了!
完美!
最后打印输出。
查看一下!
最近河北疫情超级严重。
哎,大家保护好自己一定要!
为我的家乡祈祷!
2020的大家鼠实不易
望大家2021大家牛转乾坤
加油!!!奥里给!!!!!!!!!
驴肉火烧给国际庄加油了!
但驴肉火烧也要保护好自己!!
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|