使用requests库获取网页源代码
通用代码:
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = 'utf-8'
return r.text
except:
return ""
使用bs4的BeautifulSoup库获取标签元素和值
soup = BeautifulSoup(html, "html.parser")
例如:要获取html
表格的数据,之后写入excel
。
思路:将html
的表格数据获取出来,存入二位数组,然后将数组写入excel
第一行通常是表头
def getData(soup):
trTags = soup.find_all('tr')
data = []
for (index, tr) in enumerate(trTags):
if index == 0:
thTags = tr.find_all('th')
data.append([th.text for th in thTags])
continue
data.append([td.text for td in tr.find_all('td')])
return data
先使用soup = BeautifulSoup(open(‘datare.html’), ‘html.parser’)将网页代码解析出来,然后使用soup.find_all函数查找所有的tr标签,tr表示html表格的一行的元素,第一行tr就是表头,然后再遍历tr获取td里面的每一个文本就是excel的每一个单元格的内容,可以使用二维数组先存储下来。然后将二维数组写入excel,用到xlwt这个包,遍历每一个数据写入excel。
写入excel
使用到xlwt这个库。
通用方法代码,参数传入二维数组
# 将数据写入excel
def writeExcel(data):
workbook = xlwt.Workbook()
sheet = workbook.add_sheet("Sheet")
for i in range(len(data)):
for j in range(len(data[i])):
sheet.write(i, j, data[i][j])
workbook.save("college.xls")
例子:爬取大学排行榜倒数50个的信息
完整代码:
import requests
import xlwt
from bs4 import BeautifulSoup
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = 'utf-8'
return r.text
except:
return ""
# 获取大学排名信息,将html表格转换为二维数组
def getData(soup):
trTags = soup.find_all('tr')
data = []
for (index, tr) in enumerate(trTags):
if index == 0:
thTags = tr.find_all('th')
data.append([th.text for th in thTags])
continue
data.append([td.text for td in tr.find_all('td')])
return data
# 获取某段区间排名的大学
def getSectionData(data, start, end):
return data[start:end]
# 将数据写入excel
def writeExcel(data):
workbook = xlwt.Workbook()
sheet = workbook.add_sheet("Sheet")
for i in range(len(data)):
for j in range(len(data[i])):
sheet.write(i, j, data[i][j])
workbook.save("college.xls")
def main():
url = 'https://gaokao.xdf.cn/201911/10991728.html'
html = getHTMLText(url)
soup = BeautifulSoup(html, "html.parser")
data = getData(soup)
sectionData = getSectionData(data, -51, -1)
print(sectionData)
writeExcel(sectionData)
main()
效果: