1. BeautifulSoup简介:
在介绍了urllib,urllib3,requests等数据爬取相关的python库后,今天,再介绍一个更为流行的网页数据爬虫库,BeautifulSoup。
BeautifulSoup是有一个非常流行的python库,最主要的功能是从网页抓取数据。
BeautifulSoup可以对抓取的网页中的数据进行分析。BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为 utf-8 编码。你几乎不需要考虑编码方式,当然,你也可以指定编码方式。
BeautifulSoup和requests、lxml、html6lib结合,更可以打造强大的数据爬取和解析利器。
2. BeautifulSoup实践:
例子:利用BeautifulSoup和requests对网页进行分析,获取网址和名称。
#获取网站网址和名称,以http://news.163.com/photo/#Current为例。
#http://news.163.com/photo/#Current是网易图片的网站
import requests
from bs4 import BeautifulSoup as bs
#获取网页内容
def get_web_content(url):
print(url)
res = requests.get(url) #发送请求
#print(res.encoding) #查看网页编码的
#res.encoding = 'utf-8' #跟上一个(res.encoding)结合来用,如果编码有乱码,则可以通过这个定义编码来改变
html = res.text
#print(html)
item_list = []
soup = bs(html,"html.parser") #定义一个BeautifulSoup变量
#items = soup.find_all('div',attrs={'class':'nav-mod-1'}) #span
items = soup.find_all('a',attrs={'class':'ntes-nav-index-title ntes-nav-entry-wide c-fl'})
#print(items)
for item in items:
href=item.get('href')
title=item.get('title')
#print(item)
print("网址:" + href)
print("名称:" + title)
item_list.append(href)
print('列表数量:%d' % len(item_list))
#main
if __name__ == '__main__':
#url = 'https://news.sina.com.cn/'
url = 'http://news.163.com/photo/#Current' #网易图片网址
get_web_content(url)
代码说明:
soup = bs(html,"html.parser") #定义一个BeautifulSoup变量
items = soup.find_all('a',attrs={'class':'ntes-nav-index-title ntes-nav-entry-wide c-fl'}) #获取属性class的值为“ntes-nav-index-title ntes-nav-entry-wide c-fl”的内容,
然后,可以进一步解析。
运行结果:
aaaaa:chaper user1$ python test_soup.py
http://news.163.com/photo/#Current
网址:https://www.163.com/
名称:网易首页
列表数量:1
原网站内容:
http://news.163.com/photo/#Current,是网易图片网站,html内容(截取部分)如下:
<div class="ntes-nav" id="js_N_nav">
<div class="ntes-nav-main clearfix">
<div class="c-fl">
<a class="ntes-nav-index-title ntes-nav-entry-wide c-fl" href="https://www.163.com/" title="网易首页">网易首页</a>
<!-- 应用 -->
<div class="js_N_navSelect ntes-nav-select ntes-nav-select-wide ntes-nav-app c-fl">
<a href="http://www.163.com/#f=topnav" class="ntes-nav-select-title ntes-nav-entry-bgblack JS_NTES_LOG_FE">应用
<em class="ntes-nav-select-arr"></em>
</a>
其中,ntes-nav-index-title ntes-nav-entry-wide c-fl就是class属性的一个值,可以认为是key。