【python基础】请求网页数据( urllib.request) 并解析数据(HTMLParser)

网页数据爬取

最近对爬取数据感兴趣,接触了一下python的urllib.request模块,试着使用一下。
(使用的python版本:3.7.4)

目的:向网站请求数据,并提取其中的某些情报
步骤:
1,用urllib.request向指定的URL请求数据,得到HTML数据
2,从网页HTML数据提取数据
(1)用正则表达式提取想要部分的HTML(比如列表部分的html)
(2)利用HTMLParser解析HTML情报,得到想要的页面数据

1 向网站请求数据 (urllib.request)

模块地址:urllib.request (下面的做法参照https://www.cnblogs.com/liuchaodada/p/12050745.html)

>>> from urllib import request  #导入request模块
>>> headers ={"User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"}  #定义请求数据头
>>> url = "https://baike.baidu.com/item/2021%E5%B9%B4QS%E4%B8%96%E7%95%8C%E5%A4%A7%E5%AD%A6%E6%8E%92%E5%90%8D/50539371?fromtitle=2021QS%E4%B8%96%E7%95%8C%E5%A4%A7%E5%AD%A6%E6%8E%92%E5%90%8D&fromid=50540868&fr=aladdin"  #要请求的网站地址(百度百科上【2021QS世界大学排名】的地址)
>>> req = request.Request(url,headers = headers)   #构建请求,类型urllib.request.Request
>>> type(req )

>>> responseHtml = request.urlopen(req)   #向网站请求数据,返回一个HTTPResponse类型
>>> print(responseHtml)

>>>  responseText = responseHtml.read().decode()   #read()返回的是bytes类型,解码成str
>>> print(responseText)     #得到网页的html
    
    
    
     ......(省略)

2 从网页的html提取需要的数据

对象画面如图,假设我们要提取画面的表格
【python基础】请求网页数据( urllib.request) 并解析数据(HTMLParser)_第1张图片

查看页面源码:(表格的内容 是在标签

里面
【python基础】请求网页数据( urllib.request) 并解析数据(HTMLParser)_第2张图片

(1)提取对应的html内容
提取目标:


提取方法:正则表达式(提取两个table标签包含的内容)、[\s\S]代表任意字符,*出现0次或者任意次

>>> import re
>>> r = re.compile(r'
([\s\S])*
') >>> tableHtml = r.search(responseText).group() >>> tableHtml #提取结果 '
'(省略) >>>tableHtml = tableHtml.replace(" " ," ") #替换html中的空格标签 为空格

(2)HTMLParser从table标签包含的内容里面提取情报
观察下面table标签的内容:
①橙色部分是表格的总标题
②黄色部分是表格的title
③红色的部分是表格的内容
提取方法:HTMLParser
【python基础】请求网页数据( urllib.request) 并解析数据(HTMLParser)_第3张图片

from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
    table_title = ""     #表格的总标题
    table_data = list()  #保存表格的二维list(包含列标题和各行数据)
    temp_line = list()   #临时保存一行数据的list(一维)
    start_tag = ""
    end_tag = ""
    
    def handle_starttag(self, tag, attrs):
        self.start_tag = tag
        
    def handle_endtag(self, tag):
        self.end_tag = tag
        if(tag == "tr"):#一行完结
            self.table_data.append(self.temp_line)
            self.temp_line = list()
        
    def handle_data(self, data):
        if(self.start_tag == "caption"):#总标题
            self.table_title = data
        elif(self.start_tag == "div" or self.start_tag == "span"):#表格数据
            self.temp_line.append(data)

#使用MyHTMLParser提取table部分的数据
parser = MyHTMLParser()
parser.feed(tableHtml)
for item in parser.table_data: #打印结果
    print(item)

执行结果:

 ['排名', '大学', 'Overall', '国际学生占比', '国际教师比例', '师生比']
 ['1', '麻省理工学院 United States 5+ QS Stars', '100', '91.9', '100', '100']
 ['2', '斯坦福大学 United States 5 QS Stars', '98.4', '63.6', '99.7', '100']
 ['3', '哈佛大学 United States', '97.9', '69.9', '85.2', '98.6']
 ......(省略)
 ['100', '墨西哥国立自治大学 Mexico', '58.8', '3.6', '9.9', '52.9']

3 注意

(1)如果页面里面的数据是JS生成的,在第一步得到的HTML内容里面是没有数据的。没有办法用上面的方法提取数据
(2)得到的HTMLtext里面有可能会有html的空格标签(nbsp)需要去除

你可能感兴趣的:(02.Python(基础知识))