from bs4 import BeautifulSoup import requests import openpyxl def get_html(url): try: r=requests.get(url) r.raise_for_status() r.encoding=r.apparent_encoding return r.text except: r='fail' return r def get_contents(ulist,rurl): soup=BeautifulSoup(rurl,'html.parser') trs=soup.find_all('tr') for tr in trs: ui=[] for td in tr: ts=td.string ts=ts.strip() if ts == '': continue ui.append(ts) ulist.append(ui) def saveList(ulist): wb=openpyxl.Workbook() ws=wb.active r=1 for line in ulist: for col in range(1,len(line)+1): ws.cell(row=r,column=col).value=line[col-1] r=r+1 wb.save('saveqiye500.xlsx') if __name__=="__main__": urli=[] url="https://www.maigoo.com/news/540732.html" rs=get_html(url) get_contents(urli,rs) saveList(urli)
时间: 2024-04-28 16:23:52 浏览: 146
这段代码是一个 Python 爬虫,目的是从指定网址 https://www.maigoo.com/news/540732.html 中获取企业社会责任500优完整名单,并将结果保存在 Excel 表格中。
代码中使用了 requests 库和 BeautifulSoup 库来获取网页内容和解析网页。其中,get_html() 函数用于获取网页内容,get_contents() 函数用于解析网页内容并将结果保存在一个列表中,saveList() 函数用于将列表中的数据保存在 Excel 表格中。
代码中的 if __name__=="__main__": 是 Python 中的特殊语句,表示如果该脚本被直接运行,而不是被导入到其他脚本中,那么就执行下面的语句。在这里,程序首先定义了一个空列表 urli,然后调用 get_html() 函数获取网页内容,接着将网页内容传递给 get_contents() 函数解析网页,并将解析得到的结果保存在 urli 列表中,最后将 urli 列表中的数据保存在 Excel 表格中。
不过需要注意的是,这段代码并没有考虑网页爬取的法律和道德问题,如果没有得到网站所有者的许可,对网站进行爬取可能会触犯法律,严重的甚至可能会导致刑事责任。因此,建议在进行网页爬取前,先了解相关法律法规和伦理道德规范,并遵守相关规定。
相关问题
针对以下python代码的解释以及实验小结import requests from bs4 import BeautifulSoup import re #创建获取网页数据的函数geunivText def getnuivText(url): try: r = requests.get(url) r.raise_for_status r.encoding = r.apparent_encoding return r.text except: return '' #创建解析函数并将爬取的目标数据存储 def fillunivList(ulist,html): soup = BeautifulSoup(html,'html.parser') for tr in soup.find('tbody').children: tds = tr.find_all('td') temp = [] for i in [0,1,4,5]: if i != 1: t = tds[i].string temp.append(re.sub('\s*|\n','',t)) else: t = tds[i].find('a') temp.append(t.string) ulist.append(temp) return ulist #创建打印函数 def printunivRank(ulist,num): print('{0:^4}\t{1:^10}\t\t{2:^5}\t{3:^5}'.format('排名','大学名称','总分','办学层次')) for i in range(num): a,b,c,d = ulist[i] print('{0:{4}^4}\t{1:{4}^10}\t{2:{4}^5}\t{3:{4}^5}'.format(a,b,c,d,chr(12288))) def main(): url = 'https://www.shanghairanking.cn/rankings/bcur/2021' html_text = getnuivText(url) unlist = [] fillunivList(unlist,html_text) print(printunivRank(unlist,20)) main()
这段 Python 代码使用了 requests、BeautifulSoup 和 re 三个库,爬取了上海交通大学的 2021 年度排名信息。具体实现过程如下:
1. 定义了一个函数 getnuivText,用于获取指定 url 的网页内容,利用 requests 库的 get 方法,获取网页内容,并利用 raise_for_status 方法判断是否获取成功,最后返回获取到的网页内容。
2. 定义了一个函数 fillunivList,用于解析获取到的网页内容,并将排名信息存储到一个 list 中,该函数接受两个参数:ulist 和 html,其中 ulist 为存储排名信息的 list,html 为网页内容。通过 BeautifulSoup 库将网页内容解析成 XML 格式,并通过 find 方法找到 tbody 标签中的所有子元素,即 tr 标签中的所有数据。然后遍历每个 tr 标签中的 td 标签,并将 td 中的内容提取出来,存储到一个临时 list 中,最后将临时 list 添加到 ulist 中。最后函数返回 ulist。
3. 定义了一个函数 printunivRank,用于打印排名信息,该函数接受两个参数:ulist 和 num,其中 ulist 为存储排名信息的 list,num 为需要打印的排名个数。函数首先打印表头信息,然后遍历 ulist 中的前 num 个元素,依次打印排名信息。
4. 定义了主函数 main,用于调用上述两个函数,实现爬取和打印排名信息的功能。首先指定要爬取的 url,然后调用 getnuivText 函数获取网页内容,接着调用 fillunivList 函数解析网页内容,并将排名信息存储到一个 list 中。最后调用 printunivRank 函数打印排名信息。
总的来说,这段代码主要实现了爬取和解析网页内容,并将获取到的排名信息打印出来。
import requests from bs4 import BeautifulSoup allUniv = [] def getHTMLText(url): try: r = requests.get(url,timeout=30) r.raise_for_status() r.encoding = 'utf-8' return r.text except: return "" def fillUnivList(soup): data = soup.find_all('tr') for tr in data: ltd = tr.find_all('td') if len(ltd) == 0: continue singleUniv = [] for td in ltd: singleUniv.append(td.string) allUniv.append(singleUniv) def printUnivList(num): print("{:^4}{:^10}{:^5}{:^8}{:^10}".format("排名","学校名称","省份","总分","培养规模")) for i in range(num): u=allUniv[i] print("{:^4}{:^10}{:^5}{:^8}{:^10}".format(u[0],u[1],u[2],u[3],u[6])) def main(num): url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html' html = getHTMLText(url) soup = BeautifulSoup(html,"html.parser") fillUnivList(soup) printUnivList(num) main(10)运行有错
根据您提供的代码,出错可能是因为网站的地址已经更新,代码中的网址已经无法访问。您可以将代码中的网址改为以下地址,再试一下:
```python
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2020.html'
```
此外,您在代码中定义了 `allUniv` 列表,但是在 `fillUnivList` 方法中的 `allUniv` 未使用 `global` 关键字声明为全局变量,导致无法修改该变量。您可以将 `fillUnivList` 方法中第一行的 `allUniv` 改为 `global allUniv`,来修复这个问题。
最后,如果还存在其他错误,可以将错误信息发给我,我会帮您解答。
阅读全文