欢迎订阅公众号 数据分析那些事儿

0 前言
给定一个网页的表格,怎么将网页表格中的数据爬取下来呢?
以 最好大学网 为例,怎样定向爬取网页中大学的排名呢?
1 HTML网页元素结构
可以点开网站,查看源代码,大学排名是一个表格,网页元素结构如下:
<table class=“">
<thead>
</thead>
<tbody>
<tr>
<td>row 1, cell 1</td>
<td>
<a>
<div>
row 1, cell 2
<\div>
<\a>
</td>
<td>row 1, cell 3</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>
<a>
<div>
row 2, cell 2
<\div>
<\a>
</td>
<td>row 2, cell 3</td>
</tr>
</tbody>
</table>
而我们要获取的就是表格种每行row x, cell x的内容。
2 BeautifulSoup库介绍
BeautifulSoup库通俗来说是解析、遍历、维护“标签树”(例如html、xml等格式的数据对象)的功能库。
得到一个BeautifulSoup对象后,一般通过BeautifulSoup类的基本元素来提取html中的内容。
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾 |
Name | 标签的名字,如<p>...</p>,用<tag>.name来获取 |
Attributes | 标签的属性,字典形式组织,<tag>.attrs |
NavigableString | 标签内非属性字符串,<>...</>中字符串,<tag>.string |
Comment | 标签内字符串的注释部分,一种特殊的Comment类型 |
3 编程思路
a.利用BeautifulSoup库功能,找到tbody标签
b.在tbody标签的子节点中遍历tr标签
c.在找到的tr标签中,把td的非属性字符串NavigableString的内容放入列表中
d.打印列表内容
源代码
import requests
from bs4 import BeautifulSoup
import bs4
def getHtmlText(url):
try:
r = requests.get(url, timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def getUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])
def printUnivList(ulist, num):
print("{:^10}\t{:^12}\t{:^10}\t{:^10}".format("排名","学校","地区","总分"))
for i in range(num):
print("{:^10}\t{:^12}\t{:^10}\t{:^10}".format(ulist[i][0],ulist[i][1],ulist[i][2],ulist[i][3]))
if __name__ == '__main__':
url='http://www.zuihaodaxue.com/Greater_China_Ranking2019_0.html'
html = getHtmlText(url)
ulist = []
getUnivList(ulist, html)
printUnivList(ulist,30)
运行结果
排名 学校 地区 总分
1 清华大学(北京) 大陆 100
2 北京大学 大陆 80.5
3 香港中文大学 香港 71.0
4 浙江大学 大陆 66.1
5 香港大学 香港 62.0
6 中国科学技术大学 大陆 61.4
7 上海交通大学 大陆 58.9
8 复旦大学 大陆 56.8
9 清华大学(新竹) 台湾 56.5
10 台湾大学 台湾 54.8
11 北京师范大学 大陆 53.9
12 香港城市大学 香港 50.1
13 香港科技大学 香港 49.8
14 南京大学 大陆 46.9
15 华中科技大学 大陆 44.3
16 中山大学(广州) 大陆 43.9
17 香港理工大学 香港 43.5
18 交通大学(新竹) 台湾 42.5
19 哈尔滨工业大学 大陆 42.0
20 澳门科技大学 澳门 41.9
21 中国医药大学 台湾 40.0
22 天津大学 大陆 39.8
23 西安交通大学 大陆 39.2
24 阳明大学 台湾 38.8
25 同济大学 大陆 38.5
26 东南大学 大陆 37.8
26 武汉大学 大陆 37.8
28 中国农业大学 大陆 37.6
29 四川大学 大陆 37.5
30 中南大学 大陆 36.7