使用 Beautiful Soup 解析网页内容

2023-05-16

安装Beautiful Soup

Beautiful Soup是一个Python的HTML解析框架,我们可以利用它方便的处理HTML和XML文档。Beautiful Soup有3和4两个版本,目前3已经停止开发。所以我们当然还是学习最新的Beautiful Soup 4.

首先第一件事情就是利用pip安装Beautiful Soup。我们使用下面的命令。

pip install beautifulsoup4

稍等片刻之后Beautiful Soup就安装好了。这样,我们就可以开始使用它了。如果需要详细文档的话可以参考Beautiful Soup中文文档,这是难得的不是机翻的文档。

解析文档

获取文档

Beautiful Soup只是一个HTML解析库,所以我们如果想解析网上的内容,第一件事情就是把它下载下来。对于不同的网站,可能会对请求进行过滤。糗事百科的网站就对没有UA的请求直接拒绝掉。所以如果我们要爬这样的网站,首先需要把请求伪装成浏览器的样子。具体网站具体分析,经过我测试,糗事百科只要设置了UA就可以爬到内容,对于其他网站,你需要测试一下才能确定什么设置能管用。

有了Request对象还不行,还需要实际发起请求才行。下面代码的最后一句就使用了Python3的urllib库发起了一个请求。urlopen(req)方法返回的是Reponse对象,我们调用它的read()函数获取整个结果字符串。最后调用decode('utf-8')方法将它解码为最终结果,如果不调用这一步,汉字等非ASCII字符就会变成\xXXX这样的转义字符。

import urllib.request as request

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
headers = {'User-Agent': user_agent}
req = request.Request('http://www.qiushibaike.com/', headers=headers)

page = request.urlopen(req).read().decode('utf-8')

查询和遍历方法

有了文档字符串,我们就可以开始解析文档了。第一步是建立BeautifulSoup对象,这个对象在bs4模块中。注意在建立对象的时候可以额外指定一个参数,作为实际的HTML解析器。解析器的值可以指定html.parser,这是内置的HTML解析器。更好的选择是使用下面的lxml解析器,不过它需要额外安装一下,我们使用pip install lxml就可以安装。

import bs4

soup = bs4.BeautifulSoup(page, "lxml")

有了BeautifulSoup对象,我们就可以开始解析了。首先先来介绍一下BeautifulSoup的对象种类,常用的有标签(bs4.element.Tag)以及文本(bs4.element.NavigableString)。还有注释等对象,不过不太常用,所以就不介绍了。在标签对象上,我们可以调用一些查找方法例如find_all等等,还有一些属性返回标签的父节点、兄弟节点、直接子节点、所有子节点等。在文本对象上,我们可以调用.string属性获取具体文本。

然后来说说BeautifulSoup的遍历方法。基本所有操作都需要通过BeautifulSoup对象来使用。使用方式主要有两种:一是直接引用属性,就是soup.title这样的,会返回第一个符合条件的节点;二是通过查找方法例如find_all这样的,传入查询条件来查找结果。

再来说说查询条件。查询条件可以是:字符串,会返回对应名称的节点;正则表达式,按照正则表达式匹配;列表,会返回所有匹配列表元素的节点;真值True,会返回所有标签节点,不会返回字符节点;方法,我们可以编写一个方法,按照自己的规则过滤,然后将该方法作为查询条件。本来还想写详细一点,但是由于有中文文档,所以我还是不写了。直接看关于查询的文档就好了。我还发现一篇不错的博文,大家可以参考一下,这篇博文介绍的更详细。

实际例子

爬取糗事百科段子

首先打开糗事百科网站,按F12打开开发人员工具,然后在旁边点击分离按钮把它变成独立窗口,然后切到元素标签并最大化窗口。然后点击那个鼠标按钮,再返回糗事百科页面,并点击一个段子,这样就可以查看段子在HTML文档的什么位置了。

HTML结构

首先分析一下HTML代码,然后我们就可以查找所需的内容了。这里需要说明一下,查询方法返回的是结果集,对结果集遍历可以得到标签或者文本对象。如果调用标签对象的.contents,会返回一个列表,列表内是标签、文本或注释对象。动态语言的优势就是使用灵活,缺点就是没有代码提示。虽然总共代码没几行,但是还是花了我一番功夫。

divs = soup.find_all('div', class_='article block untagged mb15')
for div in divs:
    links = div.find_all('a', href=re.compile(r'/article/\d*'), class_='contentHerf')
    for link in links:
        contents = link.span.contents
        contents = [i for i in contents if not isinstance(i, bs4.element.Tag)]
        print(contents)

上面的代码会输出首页的所有段子。这样我们便实现了半个爬虫。为什么是半个呢?因为一个完整的爬虫可以爬取多个页面,为了简便这里只爬首页,所以只能算半个爬虫。不过如果你想爬取多个页面,代码稍加修改即可实现。

百度贴吧楼层

本来还想写一个爬取百度贴吧楼层的爬虫。但是一看百度贴吧的HTML代码,我感觉这个功能好像比较复杂,所以就不做了……喜欢挑战的同学可以试试看。

百度贴吧代码

BeautifulSoup是一个HTML/XML 解析库,可以解析并修改HTML和XML文档。不过一般人都用它来解析网页实现爬虫。不过既然有中文文档,所以如果你想用它来操作XML文件,照着文档写就行了。这里就不作介绍了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Beautiful Soup 解析网页内容 的相关文章

  • ros 发布信息频率_工具使用-ROS中使用publisher、subscriber发布订阅topic

    Publisher Node 不同于cpp文件一般存在package下的src文件夹 xff0c python文件一般存储在package下的scripts文件夹下 1 2 3 4roscd beginner tutorials scrip
  • 轨迹系列1——一种基于路网图层的GPS轨迹优化方案

    文章版权由作者李晓晖和博客园共有 xff0c 若转载请于明显处标明出处 xff1a http www cnblogs com naaoveGIS 1 背景 GPS数据正常情况下有20M左右的偏移 xff0c 在遇到高楼和桥梁等情况下偏移会更
  • 材料研究方法

    编程是非常有意思的 xff0c 可是作为材料人 xff0c 学好材料才是比较重要的事情 xff0c 下面记录一些知识点 光学透镜的成像原理 光的折射 光在均匀介质中沿直线传播 在不同介质中光的传播速度不同 当光从一种介质传播到另一种介质中去
  • [微信小程序系列] 动画案例之圆点沿着圆圈运动

    作者 xff1a 滴滴公共前端团队 Tawnia 滴滴作为第一批的小程序开发者 xff0c 我们也大量地用到了动画 xff0c 积累了一些经验 xff0c 由于市面上的小程序动画案例很少 xff0c 我们也分享一部分我们做过的案例 xff1
  • Vue Iview Tree插件的无限层

    Iview lt template gt lt Tree data 61 34 baseData 34 show checkbox multiple gt lt Tree gt lt template gt lt script gt exp
  • React Component vs React Element

    React Component vs React Element 有这样的一个问题 xff1a 方法定义 function add x y return x 43 y 方法调用 add 1 2 组件定义 class Icon extends
  • 手把手学STM32(一)

    手把手学STM32 一 构建工程 这篇文章详细的介绍编写第一个固件工程 xff08 F103ZET6版本的 xff09 文档里的操作部分我使用了黄色背景色标出 xff0c 如觉麻烦 xff0c 可直接参考黄色部分 资料下载链接 xff1a
  • Linux下查看在线用户及用户进程

    可采用命令 xff1a w who last users finger 需yum安装 法一 xff1a root 64 test1 who root tty1 2015 08 19 23 15 lxh pts 0 2015 08 20 00
  • 手动制作一个QQ群机器人

    为什么80 的码农都做不了架构师 xff1f gt gt gt 最近在群里面一个朋友在玩机器人 我觉得蛮有意思的所以查了下资料搞了一个机器人 这里只是借助软件实现机器人 后面会自己去手写一个机器人 1 进入图灵的官网 http www tu
  • X-Content-Type-Options: nosniff

    如果服务器发送响应头 34 X Content Type Options nosniff 34 xff0c 则 script 和 styleSheet 元素会拒绝包含错误的 MIME 类型的响应 这是一种安全功能 xff0c 有助于防止基于
  • 过期域名

    tonha sx cn wqk410 sx cn liyongfu2005 sx cn id 3682362 sx cn dtsgfljdsbyxzrgs sx cn id 1184965 sx cn jinlei001 sx cn lin
  • CSS之 background-color: rgba(255,0,0,opacity number)

    一 xff1a backgrounde color xff1a rgba xff08 xff09 设置背景色的时候 xff0c 可以调节背景色的透明度 xff0c 注意是背景哦 xff0c 所以不会存在遮罩问题 见图 test cover
  • PrestaShop 网站后台配置(三)

    转载请注明出处 xff1a http www cnblogs com zhong dev p 4942957 html 网店版本 v1 6 这一篇文章主要介绍 前台显示模块 的调整 1 xff1a top banner xff08 首页横幅
  • 正则表达式

    Date 2019 07 03 Author Sun 本节目的 xff1a xff08 1 xff09 掌握正则表达式和re模块使用 xff08 2 xff09 python操作正则表达式 xff0c 匹配贪婪和非贪婪模式使用 xff08
  • asp.net mvc 部署时出现错误 没有对“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”的写访问权限...

    在IIS中 发布程序一个ASP NET程序 xff0c 通过IE访问报如下错误 xff1a 当前标识 NT AUTHORITY NETWORK SERVICE 没有对 C WINDOWS Microsoft NET Framework v2

随机推荐