[技术博客] BeautifulSoup4分析网页

使用BeautifulSoup4进行网页文本分析

前言

进行网络爬虫时我们需要从网页源代码中提取自己所需要的信息,分析整理后存入数据库中。

在python中,我们向网页发出请求后可以获得字符串形式的源代码,然而众所周知,HTML代码结构相当混乱,想要通过字符串本身的查找方法获取信息基本上不可能。不过好消息是python也为我们提供了正则表达式这一字符串分析利器,通过恰当的编写正则表达式就可以高效准确地分析网页。然而对于一份长长的HTML源代码,从中分析规律、编写正则表达式、验证准确性,这一轮下来需要花费大量的时间。再加上网页的跳转,多个网页的分析,在没有爬取效率的要求下使用正则表达式几乎就是一个煎熬。因此一个成熟的网页爬虫利器BeautifulSoup就此诞生,它是一个可以从HTML或XML文件中提取数据的Python库,能够方便的提取自己所需要的信息。

安装

BeautifulSoup4的安装相当简单,只需在命令行中使用pip安装即可

pip install beautifulsoup4

导入

同样简单易懂

from bs4 import BeautifulSoup

网页解析库

BeautifulSoup4默认支持Python的标准HTML解析库,可以不进行解析库的配置,但是依然建议安装lxml HTML解析库,它比Python的标准HTML解析库更加强大,速度快,容错能力强

使用方法

简易操作

以下面的HTML代码举例

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p> <p class="story">...</p>
"""

创建BeautifulSoup对象以及简易信息获取

from bs4 import BeautifulSoup

# 使用lxml作为解析库
soup = BeautifulSoup(html_doc,’lxml’) # 获取title标签的所有内容
print(soup.title) # 获取title标签的名称
print(soup.title.name) # 获取title标签的文本内容
print(soup.title.string) # 获取head标签的所有内容
print(soup.head) # 获取第一个a标签中的所有内容
print(soup.a) # 获取所有的a标签中的所有内容
print(soup.find_all("a")) # 获取id="link3"
print(soup.find(id="link3")) # 获取所有的a标签,并遍历打印a标签中的href的值
for item in soup.find_all("a"):
print(item.get("href")) # 获取所有的a标签,并遍历打印a标签的文本值
for item in soup.find_all("a"):
print(item.get_text())

通过这些操作就可以进行简易的指定标签内数据的获取

但是还是存在一些更加困难的场景

CSS选择器

BeautifulSoup整合了lxml的CSS选择器功能,使得API更易用。

通过CSS选择器可以更加精确地获取所需内容

我们可以像之前一样查找标签

print(soup.select('a'))

也可以像之前一样查找id

print(soup.select('#link3'))

我们还可以按照层级查找

print(soup.select('table > tr > td'))

我们还可以根据标签内部的属性查找

print(soup.select('a[href="http://example.com/elsie"]'))

我们甚至可以组合上面的方式查找

print(soup.select('div > a[href='http://tieba.baidu.com'] > table #list > tr > td'))

获取选项后我们可以查找其中的子项,输出它的各个属性,也可以直接输出其中包含的文本等

print(soup.select('title')[0].get_text())		# 直接输出文本
print(soup.select('title')[0].attrs['value']) # 输出它的value属性
print(soup.select('title')[0].content) # 输出它的子项

除了这些功能以外BeautifulSoup4还有其他的许多优秀功能等待大家的挖掘,比如.children迭代器、.prettify()格式化输出等。

希望大家能通过BeautifulSoup4的使用大大降低肝度。

[技术博客] BeautifulSoup4分析网页的更多相关文章

  1. 第七周技术博客发表 web网页开发

    a<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org ...

  2. 第五周技术博客发表 web 网页开发

    <html><head> <title> HTML</title></head><body > <h1>会员注册界面 ...

  3. 如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛

        如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己 ...

  4. 个人技术博客(α)------javaweb的学习路程

    该博文大致内容是学习的一个过程,心得,并不是以技术博客为主,在此说明. 关于javaweb的学习开始的时间大概是从大二下(2017年6.7月份)的暑假开始的,在学长的介绍下加入了实验室进行学习,由于是 ...

  5. 在Ubuntu14.04上安装WordPress4搭建技术博客

    1.安装LAMP环境 1.1 安装Apache2 1.2 安装MySQL5 1.3 安装PHP5 1.4 安装phpMyAdmin 2.初始化数据库 3.下载并配置WordPress 4.配置Apac ...

  6. [技术博客]使用CDN加快网站访问速度

    [技术博客]使用CDN加快网站访问速度 2s : most users are willing to wait 10s : the limit for keeping the user's atten ...

  7. 转: BAT等研发团队的技术博客

    BAT 技术团队博客   1. 美团技术团队博客:  地址: http://tech.meituan.com/ 2. 腾讯社交用户体验设计(ISUX) 地址:http://isux.tencent.c ...

  8. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

  9. IT技术博客收藏

    1. coolshell.cn 特点: 每篇都是精品 2. 云风 特点: 3. 阮一峰的博客 特点:高精深 3. offbye涛声依旧-全端技术博客 特点: android的开发技术比较多,非常值得一 ...

随机推荐

  1. GDB调试:Linux开发人员必备技能

    开篇词:Linux C/C++ 开发人员要熟练掌握 GDB 调试 大家好,我是范蠡,目前在某知名互联网旅游公司基础框架业务部技术专家组任开发经理一职. 本系列课程的主题是 Linux 后台开发的 C/ ...

  2. Vue3 父组件调用子组件的方法

    Vue3 父组件调用子组件的方法 // 父组件 <template> <div> 父页面 <son-com ref="sonRef"/> < ...

  3. 【简单数据结构】二叉树的建立和递归遍历--洛谷 P1305

    题目描述 输入一串二叉树,用遍历前序打出. 输入格式 第一行为二叉树的节点数n.(n \leq 26n≤26) 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输出格式 前序 ...

  4. 知乎vscode插件修改和重新编译

    需求来源 vscode插件修改代码要怎样重新编译并安装到vscode中? 起源于我使用一个vscode插件,它可以在vscode中发布文章到知乎上,然后我修改了插件的部分源代码,希望在vscode中安 ...

  5. 记一次 .NET 某上市工业智造 CPU+内存+挂死 三高分析

    一:背景 1. 讲故事 上个月有位朋友加wx告知他的程序有挂死现象,询问如何进一步分析,截图如下: 看这位朋友还是有一定的分析基础,可能玩的少,缺乏一定的分析经验,当我简单分析之后,我发现这个dump ...

  6. CLion远程调试嵌入式开发板程序

    CLion远程调试嵌入式开发板程序 目录 CLion远程调试嵌入式开发板程序 1. 目的 2. 前提条件 3. CLion设置 3.1 设置一个Deployment 3.2 上传需要的目录到目标板子 ...

  7. AT3945-[ARC092D]Two Faced Edges【dfs】

    正题 题目链接:https://www.luogu.com.cn/problem/AT3945 题目大意 \(n\)个点\(m\)条边的一张图,对于每条边求它翻转后强连通分量数量是否变化. \(1\l ...

  8. P3515-[POI2011]Lightning Conductor【整体二分,决策单调性】

    正题 题目链接:https://www.luogu.com.cn/problem/P3507 题目大意 \(n\)个数字的一个序列\(a\),对于每个位置\(i\)求一个\(p_i\)使得对于任意\( ...

  9. ASP.NET Core 学习笔记 第二篇 依赖注入

    前言 ASP.NET Core 应用在启动过程中会依赖各种组件提供服务,而这些组件会以接口的形式标准化,这些组件这就是我们所说的服务,ASP.NET Core框架建立在一个底层的依赖注入框架之上,它使 ...

  10. 关于Windows操作系统重定向

    在用C++做一个文件遍历的时候发现,当我遍历C:\Windows\system32文件夹时,获取到的文件数目和实际总是对不上.在通过他人帮助后了解到了重定向这个概念,我百度了一下,下面为粘贴内容. S ...