菜鸟学习~(第八期):爬虫基础(三),Beautiful Sou
1、Beautiful Soup 是什么?
Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库。
2、有什么作用?
文档导航,查找,修改文档的方式,主要应用在网页抓取数据方面,
官方解释如下:
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup++自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码++。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
3、安装BetautifulSoup4
切换到Python的Scripts目录下
打开命令行窗口(CMD) -> 输入 pip install BeautifulSoup4 命令)
类似地,
win7系统下安装命令(Python3.4.3以前的版本):
python -m pip install BetautifulSoup4
由于Python3.7.4已经自带了BetautifulSoup4库,所以你在安装的时候回出现这种情况,不过以前的版本如Python3.4.3是没有这个库的,所以还在使用这个版本的同学请自行安装BetautifulSoup4。
4、爬百度百科“AI”的词条
编写一个爬虫,爬百度百科“AI”的词条,源码如下:
import urllib.request#先使用urllib.request模块从指定网址上读取HTML文件
import re #这里使用了正则表达式,我会在后期介绍着部分内容
from bs4 import BeautifulSoup
def main():
url = "https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/9180?fromtitle=AI&fromid=25417"
response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html, "html.parser") # 使用 Python 默认的解析器
for each in soup.find_all(href=re.compile("view")):
#使用for迭代读取
print(each.text, "->", ''.join(["http://baike.baidu.com", each["href"]]))
# 上边用 join() 不用 + 直接拼接,是因为 join() 被证明执行效率要高很多
if __name__ == "__main__":
main()
执行结果,将所有包含“view”的链接按下边格式打印出来
说明一下
if __name__ == '__main__':
的作用:防止在被其他文件导入时显示多余的程序主体部分.
每日三道题, 笔试面试不吃亏:
题目1(排列组合):有四个数字:1、2、3、4,5,能组成多少个互不相同且无重复数字的四位数?各是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4,5。组成所有的排列后再去 掉不满足条件的排列。
for i in range(1,6):#1到5的整数,这四位数设为i,j,k,m
for j in range(1,6):
for k in range(1,6):
for m in range(1,6):
if( i != k ) and (i != j) and(i != m) and (j != k) and (j != m) and (k != m):
print (i,j,k,end = "||" )
运行结果
题目2:企业发放的奖金根据利润提成:
(1)
利润低于或等于10万元时,奖金可提10%;
(2)
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
(3)
20万到40万之间时,高于20万元的部分,可提成5%;
(4)
40万到60万之间时高于40万元的部分,可提成3%;
(5)
60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,
从键盘输入当月利润I,求应发放奖金总数?
程序分析:请利用数轴或区间来分界,定位。注意定义时需把奖金定义成长整型。
i = int(input('净利润:'))
arr = [1000000,600000,400000,200000,100000,0]
#超过的部分
rat = [0.01,0.015,0.03,0.05,0.075,0.1]
r = 0
for idx in range(0,6):
if i > arr[idx]:
r += (i-arr[idx]) * rat[idx]
print ((i-arr[idx]) * rat[idx])
i = arr[idx]
print("应发放奖金总数为:",r)
运行结果
当然,可以使用if-elif-else语句来解决,具体自己下去练习。
题目3:一个整数,它加上100后是一个完全平方数,再加上256又是一个完全平方数,请问该数是多少?
数学解释:
程序分析:假设该数为 x。
(1)、则:x + 100 = n^2, x + 100 + 256 = m^2
(2)、计算等式:m^2 - n^2 = (m + n)(m - n) = 256
(3)、假设: m + n = i,m - n = j,i * j =256,i 和 j 至少一个是偶数
(4)、解3中的二元方程可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。
(5)、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。
(6)、由于 i * j = 256, j>=2,则 1 < i < 256 / 2 + 1=129。
接下来将 i 的所有数字循环计算即可。
程序源代码:
#b = 256/2+1
b = 129
for i in range(1,b):
if 256 % i == 0:
j = 256 / i;
if i > j and (i + j) % 2 == 0 and (i - j) % 2 == 0 :
m = (i + j) / 2
n = (i - j) / 2
x = n * n - 100
print("n=",n)
print("m=",m)
print("所求的数为:",x)
运行结果