本博客会先介绍Beautiful Soup库的基础知识,再讲解1个相关实战项目。非常基础,具体视频以及课件,在中国大学MOOC里可以找到,由北京理工大学,嵩天教授主讲:Python网络爬虫与信息提取
主要介绍Beautifou Soup的基本使用以及bs4库的基本元素
可以看到通过Beautiful Soup库解析出来得到的,不再是像requests库那样的一个html页面,而是一个个的标签。即如下图所示:建立html页面和标签之间的对应关系
使用方法举例,如图是demo页面:
BeautifulSoup基本元素举例输出,如下图:
还有个**find_all()**方法
这个方法经常用到,大家多留心,如图是使用举例:
中国大学排名链接
标签如下图:我们先找到tbody标签,再找到其子标签tr,接着找tr标签的子标签,也就是td标签,直接获取每个td标签里的值。
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 fillUnivList(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].text, tds[1].text, tds[4].text])
def printUnivList(ulist, num):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名", "学校名称","总分",chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0].strip(), u[1].strip(), u[2].strip(),chr(12288)))
def main():
unifo = []
url = "https://www.shanghairanking.cn/rankings/bcur/2020"
html = getHTMLText(url)
fillUnivList(unifo, html)
printUnivList(unifo, 20)
main()
tag.text的用法是:获取标签下所有文字的内容
tag.contents的用法:将其子节点以列表形式输出,因此ulist.append可以改为:
#ulist.append([tds[0].text, tds[1].text, tds[4].text])之前的代码
ulist.append([tds[0].contents[0], tds[1].contents[0].text, tds[4].contents[0]])
关于tag.string的说明:这就是为什么不用tds[0].string:
即标签中既有bs4.element.NavigableString也有bs4.element.Comment,会导致回报None。
多看官方文档(比直接找博客来的快且准确):文档链接请点击