首页 > 编程 > Python > 正文

python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)

2020-02-16 01:35:59
字体:
来源:转载
供稿:网友

前言

python爬虫系列文章的第3篇介绍了网络请求库神器 Requests ,请求把数据返回来之后就要提取目标数据,不同的网站返回的内容通常有多种不同的格式,一种是 json 格式,这类数据对开发者来说最友好。另一种 XML 格式的,还有一种最常见格式的是 HTML 文档,今天就来讲讲如何从 HTML 中提取出感兴趣的数据

自己写个 HTML 解析器来解析吗?还是用正则表达式?这些都不是最好的办法,好在,Python 社区在这方便早就有了很成熟的方案,BeautifulSoup 就是这一类问题的克星,它专注于 HTML 文档操作,名字来源于 Lewis Carroll 的一首同名诗歌。

BeautifulSoup 是一个用于解析 HTML 文档的 Python 库,通过 BeautifulSoup,你只需要用很少的代码就可以提取出 HTML 中任何感兴趣的内容,此外,它还有一定的 HTML 容错能力,对于一个格式不完整的HTML 文档,它也可以正确处理。

安装 BeautifulSoup

pip install beautifulsoup4

BeautifulSoup3 被官方放弃维护,你要下载最新的版本 BeautifulSoup4。

HTML 标签

学习 BeautifulSoup4 前有必要先对 HTML 文档有一个基本认识,如下代码,HTML 是一个树形组织结构。

<html>  <head>  <title>hello, world</title> </head> <body>  <h1>BeautifulSoup</h1>  <p>如何使用BeautifulSoup</p> <body></html> 
它由很多标签(Tag)组成,比如 html、head、title等等都是标签 一个标签对构成一个节点,比如 ... 是一个根节点 节点之间存在某种关系,比如 h1 和 p 互为邻居,他们是相邻的兄弟(sibling)节点 h1 是 body 的直接子(children)节点,还是 html 的子孙(descendants)节点 body 是 p 的父(parent)节点,html 是 p 的祖辈(parents)节点 嵌套在标签之间的字符串是该节点下的一个特殊子节点,比如 “hello, world” 也是一个节点,只不过没名字。

使用 BeautifulSoup

构建一个 BeautifulSoup 对象需要两个参数,第一个参数是将要解析的 HTML 文本字符串,第二个参数告诉 BeautifulSoup 使用哪个解析器来解析 HTML。

解析器负责把 HTML 解析成相关的对象,而 BeautifulSoup 负责操作数据(增删改查)。”html.parser” 是Python内置的解析器,”lxml” 则是一个基于c语言开发的解析器,它的执行速度更快,不过它需要额外安装

通过 BeautifulSoup 对象就可以定位到 HTML 中的任何一个标签节点。

from bs4 import BeautifulSoup text = """<html>  <head>  <title >hello, world</title> </head> <body>  <h1>BeautifulSoup</h1>  <p class="bold">如何使用BeautifulSoup</p>  <p class="big" id="key1"> 第二个p标签</p>  <a href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a> </body></html> """soup = BeautifulSoup(text, "html.parser")# title 标签>>> soup.title<title>hello, world</title># p 标签>>> soup.p<p class="bold">/u5982/u4f55/u4f7f/u7528BeautifulSoup</p># p 标签的内容>>> soup.p.stringu'/u5982/u4f55/u4f7f/u7528BeautifulSoup'            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表