使用BeautifulSoup解析网页

标签: 网络爬虫  python

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/"]')
版权声明:本文为weixin_44123362原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44123362/article/details/104900494