目录
一、BeautifulSoup库
二、信息标记与提取方法
三、实例(静态获取)
(1)BeautifulSoup库:解析、遍历、维护“标签树”的功能库
(2)使用BeautifulSoup库:
from bs4 import BeautifulSoup
soup=BeautifulSoup(’< p>data p>,‘html.parser’)
(3)BeautifulSoup对应一个HTML/XML文档的全部内容
demo:
#查看标签内容
import requests
r = requests.get('https://python123.io/ws/demo.html')
#print(r.text)
demo=r.text
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo,'html.parser')
print(soup.title)#This is a python demo page
#name标签的名字
tag=soup.a
print(tag)#Basic Python
print(soup.a.name)#a
print(soup.a.parent.name)#p
print(soup.a.parent.parent.name)#body
#attrs标签的属性
print(tag.attrs)
print(tag.attrs['class'])
print(tag.attrs['href'])
#标签属性的类型
print(type(tag.attrs))#字典类型
print(type(tag))#
#Tag的NavigableString标签内非属性字符串
print(soup.a.string)#Basic Python
print(soup.p)#The demo python introduces several python courses.
#NavigableString可以跨越多个层次
print(type(soup.p.string))#
#Tag的Comment
newsoup = BeautifulSoup("This is not a comment
","html.parser")
print(newsoup.b.string)#This is a comment
print(type(newsoup.b.string))#
print(newsoup.p.string)#This is not a comment
print(type(newsoup.p.string))#
demo:
import requests
from bs4 import BeautifulSoup
r = requests.get('https://python123.io/ws/demo.html')
#print(r.text)
demo=r.text
soup = BeautifulSoup(demo,"html.parser")
tag=soup.a
#下行遍历
#遍历儿子节点
for child in soup.body.children:
print(child)
#遍历子孙节点
for child in soup.body.descendants:
print(child)
#上行遍历
#.parent返回节点父亲标签
print(soup.title)#This is a python demo page
print(soup.title.parent)#This is a python demo page
#html标签的父亲
print(soup.html.parent)
#标签树的上行遍历
for parent in soup.a.parents:
if parent is None:
print(parent)
else:
print(parent.name)
#平行遍历
print(soup.a.next_sibling)# and
print(soup.a.next_sibling.next_sibling)#Advanced Python
print(soup.a.previous_sibling)
#遍历后续节点
for sibling in soup.a.next_siblings:
print(sibling)
#遍历前续节点
for sibling in soup.a.previous_siblings:
print(sibling)
<>.find_all(name,attrs,recursive,string,**kwargs):返回一个列表类型,存储查找的结果
name:对标签名称的检索字符串
attrs:对标签属性值的检索字符串,可标注属性检索
recursive:是否对子孙全部检索,默认True
string:<>…>中字符串区域的检索字符串
demo:
import requests
from bs4 import BeautifulSoup
r = requests.get('https://python123.io/ws/demo.html')
demo=r.text
soup = BeautifulSoup(demo,"html.parser")
tag=soup.a
#HTML中所有的超链接,首先找到a标签,其次搜索关键信息’href’
for link in soup.find_all('a'):
print(link.get('href'))
#name : 对标签名称的检索字符串
for tag in soup.find_all(True):
print(tag.name)
#查找a,b标签,一列表形式给出
print(soup.find_all('a'))
print(soup.find_all(['a', 'b']))
for tag in soup.find_all(True): # 显示所有的标签信息
print(tag.name)
# 引入正则表达式库
import re
# 返回一个列表类型
print(soup.find_all('p', 'course') )
# 返回一个列表
print(soup.find_all(id='link1'))
# 返回一个空列表,因为没有link元素,要用正则表达式库
print(soup.find_all(id='link'))
# 用了正则表达式,返回包含link的列表
print(soup.find_all(id=re.compile('link')))
#检索字符串信息
print(soup.find_all(string="Basic Python"))
#正则表达式类似于模糊查询
print(soup.find_all(string=re.compile('Python')))
demo:
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 ""
#key提取关键数据
#先找到tbody标签之后,之后找到tr标签,找到td信息
def fillUnivList(ulist,html):
soup = BeautifulSoup(html, 'html.parser')
for tr in soup.find('tbody').children:
#不是tag类型过滤掉
if isinstance(tr,bs4.element.Tag):
tds=tr('td')
#append() takes exactly one argument (3 given)
ulist.append([tds[0].string, tds[1].string, tds[2].string])
def printUnivList(ulist,num):
print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))
for i in range(num):
u = ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))
def main():
uinfo = []
url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20个大学
main()
输出结果:
输出不整齐,改进:
printUnivList(ulist,num)修改成下面这个即可:
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],u[1],u[2],chr(12288)))
输出结果:
1
下面哪个Python库不能用于提取网页信息?
A
Beautiful Soup
B
re
C
lxml
D
requests
正确答案 D
requests是爬虫库,只用于获取页面,不对页面信息进行提取。
2
下面代码中,BeautifulSoup指什么?
from bs4 import BeautifulSoup
A
Python第三方库的名字
B
类的名称
C
用户定义的变量名称
D
bs4库中的一个函数名称
正确答案 B
from bs4 import BeautifulSoup
指从bs4库中引入一个元素(函数或类),这里BeautifulSoup是类。
3
在bs4库中,下面说法错误的是:
A
一个HTML文档与一个标签树等价
B
标签树上除了标签外,节点还可能是字符串(NavigableString)类型。
C
一个HTML文档与BeautifulSoup对象等价
D
一个HTML文档可以包含多个标签树
正确答案 D
一个文档只对应一个标签树
4
下面代码中,href属于哪个类别?
TEXT
A
名称
B
字符串
C
属性
D
标签
正确答案 C
a是标签,href是属性。
5
获得soup对象中,能够获得a标签全部属性的代码是:
from bs4 import BeautifulSoup soup = BeautifulSoup(demo, "html.parser")
A
B
C
D
正确答案 B
a标签是HTML预定义标签,通过soup.a可以直接获取。
6
1 分
#下面哪个不是信息提取的思路?
A
通过自然语言处理方式找到所需提取的信息。
B
按照信息格式完全解析,解析后找到所需提取的信息。
C
无视格式,直接搜索找到所需提取的信息。
D
结合部分格式解析和搜索的方式提取所需要的信息。
正确答案 A
自然语言理解一般针对语言文本,HTML等信息标记格式产生的文本需要采用信息提取方式获得语言文本,才使用自然语言理解方式进一步处理(如果有需要的话)。
7
1 分
为什么Beautiful Soup库叫这个名字?
A
开发者喜欢煲汤
B
原因不详,第三方库起名原因多种多样,没必要深究
C
之前有类似的库叫类似的名字
D
Python Software Foundation要求开发者叫这个名字
正确答案 B
Python计算生态采用"集市"模式,命名权归贡献者。
8
1 分
#Beautiful Soup库不可加载的解析器是:
A
re
B
html5lib
C
html.parser
D
lxml
正确答案 A
bs4解析器是能够解释HTML或XML的一个第三方库,re是用来表达并匹配正则表达式的,不能够装载到bs4库中。
9
1 分
#不属于bs4库遍历标签树方法的是:
A
上行遍历
B
平行遍历
C
下行遍历
D
跳跃遍历
正确答案 D
遍历树一般没有"跳跃遍历"。
10
1 分
#关于Beautiful Soup库说法错误的是:
A
Beautiful Soup库可常用于生成标签树
B
Beautiful Soup库也叫bs4库
C
Beautiful Soup库能够对HTML和XML等格式进行解析
D
Beautiful Soup库是解析、遍历、维护标签树的功能库
正确答案 A
Beautiful Soup库不能够生成标签树,只能解析、遍历和维护