BeautifulSoup可以从HTML或者XML文件中提取数据。
BeautifulSoup的安装
安装BeautifulSoup非常简单,使用pip安装即可。在cmd中输入:
pip install bs4
使用BeautifulSoup获取博客主题
import requests
from bs4 import BeautifulSoup
link = "http://www.santostang.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/70.0.3538.25 \
Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400 ',
'Host': 'www.santostang.com'
}
r = requests.get(link, headers=headers)
soup = BeautifulSoup(r.text, "html.parser")
#find只是找到第一条结果
first_title = soup.find("h1", class_="post-title").a.text.strip()
print("第一篇文章的标题是:", first_title)
#find_all可以找到所有的结果
title_list = soup.find_all("h1", class_="post-title")
for i in range(len(title_list)):
title = title_list[i].a.text.strip()
print("第%s篇文章的标题是: %s" %(i+1,title))
结果如下:
BeautifulSoup的其他功能
import requests
from bs4 import BeautifulSoup
link = "http://www.santostang.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/70.0.3538.25 \
Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400 ',
'Host': 'www.santostang.com'
}
r = requests.get(link, headers=headers)
soup = BeautifulSoup(r.text, "html.parser")
print(soup.prettify())
比如上面我爬取了主页的源码,但看起来比较杂乱,所以我使用了soup对其进行美化:
对比一下没有美化过的:
其实,BeautifulSoup对象是一个复杂的属性结构,它的每一个节点都是一个Python对象,获取网页内容就是一个提取对象内容的过程。而提取对象的方法可以归纳为3种:
(1)遍历文档树
(2)搜索文档树
(3)CSS选择器
(1)遍历文档树
例如,要获取<h3>
标签,只需要输入:
soup.header.h3
对于某个标签的子节点,我们可以用contents
把它的子节点
以列表的方式输出:
soup.header.div.contents
我们也可以使用children方法
获得所有子标签:
for child in soup.header.div.children:
print(child)
上述方法只能获取该节点的下一级节点,如果要获得所有子子孙孙的节点,就要用.descendants
(后代)方法:
for child in soup.header.div.descendants:
print(child)
除了获取子节点外,还可以使用.parent
方法获得父节点的内容:
a_tag = soup.header.div.a
a_tag.parent
(2)搜索文档树
遍历文档树的方法其实用的比较少,最常用的是搜索文档树。在搜索文档树中,最常用的是find()
和find_all()
这两种方法也可以与正则表达式结合起来使用:
for tag in soup.find_all(re.compile("^h"):
print(tag.name)
上面的例子能够找出所有以h开头的标签。
(3)CSS选择器
CSS选择器方法既可以作为遍历文档树的方法提取数据,也可以作为搜索文档树的方法提取数据。
例如,可以通过tag标签逐层查找:
soup.select("header h3")
也可以通过某个tag标签下的直接子标签遍历,例如:
print("soup.select("header > h3"))
print("soup.select("div > a"))
第一行得到的结果和前面一样,第二行得到的结果是<div>
下所有的<a>
标签
CSS选择器也可以实现搜索文档树的功能:
例如,要找所有链接以http://www.santostang.com/
开始的<a>
标签:
soup.select('a[href^="http://www.santostang.com/"]')