使用Requests和Beautiful Soup抓取网页内容

Beautiful Soup是抓取网页常用的一个模块,用于从HTML页面中提取信息,它显然比正则表达式好用很多。

简单示例

我们先来看下如何解析下面这个简单的HTML文件:

<!-- This is the example.html example file. -->
<html>
<head><title>The Website Title</title></head>
<body>
<p>Download my <strong>Python</strong> book from <a href="http://
inventwithpython.com">my website</a>.</p>
<p class="slogan">Learn Python the easy way!</p>
<p>By <span id="author">Al Sweigart</span></p>
<p>By <span id="author">Starm Lee</span></p>
</body></html>

一般我们抓取网页,第一件事自然是获取网页文件,通常我们用Requests来做这件事。例如:

import requests, bs4
res = requests.get('http://www.gushiwen.org')
res.raise_for_status()
guShiSoup = bs4.BeautifulSoup(res.text)

在我们这个简答的例子里,我们用直接打开硬盘上的文件来代替

import bs4
exampleFile = open('example.html')
exampleSoup = bs4.BeautifulSoup(exampleFile.read())

接着,我们用BS里常用的 select() 方法来摘取我们所需要的内容:

elems = exampleSoup.select('#author')

然后,我看一下它的长度

if len(elems) > 0:
    print(elems[0].getText())

如果长度大于0,才说明是有内容可以获取的。我们通过getText()方法,然后打印出来。

在交互式编辑器如 jupyter里,我们可以很方便的看到,想要的结果已经出来了:

在这里插入图片描述
这段代码将带有 id="author"的元素,从示例 HTML 中找出来。我们使用select(’#author’)返回一个列表,其中包含所有带有id="author"的元素。。在该元素上调用getText()方法,返回该元素的文本,或内部的HTML。

关于选择元素的简单例子
在这里插入图片描述

实际示例

我们以抓取一个古诗文网站的诗文内容为例。
想要达到的效果是,打开它的首页,抓取诗歌标题、朝代作者和内容,然后存入文本文件。
在这里插入图片描述
我们先来看下他的源码,截取对应部分:
在这里插入图片描述
根据这个,我们可以用
1)元素a 之内的 b 元素,且style为“’‘font-size:18px; line-height:22px; height:22px;’)”来提取诗文标题,所以我们有代码

titleElem = guShiSoup.select('a > b',style_='font-size:18px; line-height:22px; height:22px;')

2)朝代和作者部分,p元素的类型也都一样是source,所以我根据这个来获取,这里我们说一个新方法,就是find_all,可以根据元素和其属性进行选择

authorElem = guShiSoup.find_all('p',class_='source')

3)同理,诗文内部部分,处理成

contentElem = guShiSoup.find_all('div',class_='contson')

以上部分,对照源码分析就可以得出。当然,如果有时间多分析一下,也许可以找出更便捷的方法。

4)附源码

"""
author: David
Date: 2020-09-24
Desc: Demo for Beautiful Soup
"""
import requests, bs4
res = requests.get('http://www.gushiwen.org')
res.raise_for_status()
guShiSoup = bs4.BeautifulSoup(res.text)

titleElem = guShiSoup.select('a > b',style_='font-size:18px; line-height:22px; height:22px;')
authorElem = guShiSoup.find_all('p',class_='source')
contentElem = guShiSoup.find_all('div',class_='contson')

poemFile = open('gushi.txt', 'w')

for i in range(len(titleElem)):
    #print(titleElem[i].getText())
    #print(authorElem[i].getText())
    #print(contentElem[i].getText())

    poemFile.write(titleElem[i].getText()+'\n')
    poemFile.write(authorElem[i].getText()+'\n')
    poemFile.write(contentElem[i].getText()+'\n\n')


poemFile.close()

"""
1. 标题部分
<p><a style="font-size:18px; line-height:22px; height:22px;" href="https://so.gushiwen.cn/shiwenv_9e88fe42f765.aspx" target="_blank"><b>轻肥</b></a></p>

2. 作者信息部分
<p class="source"><a href="https://so.gushiwen.cn/shiwen/default.aspx?cstr=%e5%94%90%e4%bb%a3" target="_blank">唐代</a><span>:</span><a href="https://so.gushiwen.cn/search.aspx?value=%e7%99%bd%e5%b1%85%e6%98%93" target="_blank">白居易</a></p>

3. 诗文内容部分
<div class="contson" id="contson9e88fe42f765">
                    意气骄满路,鞍马光照尘。<br />借问何为者,人称是内臣。<br />朱绂皆大夫,紫绶或将军。(或 一作:悉)<br />夸赴军中宴,走马去如云。<br />尊罍溢九酝,水陆罗八珍。<br />果擘洞庭橘,脍切天池鳞。<br />食饱心自若,酒酣气益振。<br />是岁江南旱,衢州人食人。 
                </div>
                
"""
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页