xml
通过标签表达信息,成对出现,可扩展性好,但繁琐。
json
有类型的键值对,可以嵌套使用 ,适合程序处理(js),较xml简洁。
“key”:“value”
“key”:[“value1”, “value2”]
“key”:{“subkey”:“subvalue”}
yaml
无类型键值对,也就是没有引号,文本信息比例最好,可读性好。
name:
-北京理工大学
-天津大学
#表示注释,-表示并列的值信息,键值对之间可以嵌套。
信息提取的一般方法
方法一:完整解析信息的标记形式,再提取关键信息。
优点:信息解析准确。
缺点:提取过程繁琐,速度慢。
方法二 :无视标记形式,直接搜索关键信息。
对信息的文本查找函数即可。
优点:提取过程简洁,速度较快。
缺点:提取结果准确性与信息内容相关。
方法三:融合方法
提取HTML中所有URL链接
1搜索到所有<a>
标签
2解析<a>
标签格式,提取href后的链接内容。
<>.find_all(name, attrs, recursive,string, **kwargs)
返回 一个列表类型,存储查找的结果。
name:对标签名称的检索字符串。
attrs:对标签属性值的检索字符串 ,可标注属性检索。
recursive:是否对子孙全部检索,默认True。
打印所有标签
for tag in soup.find_all(True): print(tag.name)
找到所有的带有b的标签
for tag in soup.find_all(re.compile('b')): print(tag.name)
找带链接的
print(soup.find_all(id=re.compile(‘link’)))
找带关键字的
print(soup.find_all(string="Basic Python"))
用正则表达式找到带关键字的
print(soup.find_all(string=re.compile("python")))
<tag>(..)
等价于 <tag>.find_all(..)
soup(..)
等价于 soup.find_all(..)
扩展方法
<>.find():搜索 且只返回一个结果,字符串类型,通.find_all()参数。
<>.find_parents():在先辈结点中搜索,返回列表类型,同.find_all()参数。
<>.find_parent():在先辈结点中返回一个结果,字符串类型,同.find()参数。
<>.find_next_siblings():在后续平行节点中搜索 ,返回列表类型 ,同.find_all()参数。
<>.find_next_sibling():在后续平行节点中搜索,字符串类型,同.find()参数。
<>.find_previous_siblings():在前序平行节点中搜索,返回 列表类型,同.find_all()参数。
<>find_previous_sibling():在前序平行节点中返回一个结果,字符串类型,同.find()参数。
信息提取的一般方法
<>.find_all(name, attrs, recursive, string, **kwargs)
<tag>(..)
等价于 <tag>.find_all(..)
soup(..)
等价于 soup.find_all(..)
程序的结构设计
步骤一:从网络上获取大学排名网页内容
getHTMLText()
步骤 二:提取网页内容中信息到 合适的数据结构
fillUnivList()
步骤三:利用数据结构展示并输出结果
printUnivList()
爬取中国排名前20的网站
import requests
import bs4
from bs4 import BeautifulSoup
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")
#遍历tbody的孩子
for tr in soup.find('tbody').children:
#如果这个tag存在
if isinstance(tr, bs4.element.Tag):
#获得td标签列表
tds = tr('td')
#把想要的属性存到ulist中
ulist.append([tds[0].string, tds[1].string, tds[2].string])
def printUnivList(ulist, num):
#输出
print("{:^10}\t{:^10}\t{:^10}".format("排名", "学校名称", "总分"))
#循环
for i in range(num):
u = ulist[i]
print("{:^10}\t{:^10}\t{:^10}".format(u[0], u[1], u[2]))
print("Suc" + str(num))
def main():
#数组,用来存结果
uinfo = []
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20)
main()