Python Beautiful Soup 模块对象创建与解析详解
本文详细介绍 Python Beautiful Soup 模块中 BeautifulSoup、Tag 和 NavigableString 三种核心对象的创建与使用方法。涵盖通过字符串或文件对象初始化 BeautifulSoup,指定 features 参数选择解析器(如 lxml、html5lib)的技巧,以及获取和修改 Tag 名称、属性及文本内容的实际操作。
安装
通过 pip 安装 Beautiful Soup 模块:pip install beautifulsoup4 。
还可以使用 PyCharm IDE 来写代码,在 PyCharm 中的 Preferences 中找到 Project ,在里面搜索 Beautiful Soup 模块,进行安装即可。
创建 BeautifulSoup 对象
Beautiful Soup 模块广泛用于从网页中提取数据。利用该模块,我们可以从 HTML 或 XML 文档中抓取各类信息,例如提取网页中的所有链接或标签内的具体内容。
为实现这一功能,Beautiful Soup 提供了多种对象和方法。任何 HTML 或 XML 文档均可转换为不同的 Beautiful Soup 对象,这些对象具备特定的属性和方法,便于我们提取所需数据。
Beautiful Soup 主要包含以下三种对象:
- BeautifulSoup
- Tag
- NavigableString
创建 BeautifulSoup 对象
构建一个 BeautifulSoup 对象是任何 Beautiful Soup 项目的起始步骤。
BeautifulSoup 构造函数接受字符串或类文件对象(file-like object,如本地文件或网页内容)作为输入。
通过字符串创建 BeautifulSoup 对象
在 BeautifulSoup 构造函数中直接传递字符串以创建对象。
helloworld = '<p>Hello World</p>' soup_string = BeautifulSoup(helloworld) print soup_string <html><body><p>Hello World</p></body></html>
通过类文件对象创建 BeautifulSoup 对象
在 BeautifulSoup 构造函数中传递类文件对象来创建实例,这在解析在线网页时尤为实用。
url = "http://www.glumes.com" page = urllib2.urlopen(url) soup = BeautifulSoup(page) print soup
除了类文件对象,我们还可以将本地文件对象传递给 BeautifulSoup 构造函数来生成对象。
with open('foo.html','r') as foo_file :
soup_foo = BeautifulSoup(foo_file)
print soup_foo
为 XML 解析创建 BeautifulSoup 对象
Beautiful Soup 模块同样支持解析 XML 文档。
创建 BeautifulSoup 对象时,模块会自动选择合适的 TreeBuilder 类来构建 HTML/XML 树。默认情况下,系统选择 HTML TreeBuilder,并使用默认 HTML 解析器生成 HTML 结构树。上述代码中,由字符串生成的 BeautifulSoup 对象即被解析为 HTML 树结构。
若希望 Beautiful Soup 将输入内容解析为 XML 类型,需在构造函数中明确指定 features 参数。通过特定的 features 参数,Beautiful Soup 会选择最符合要求的 TreeBuilder 类。
理解 features 参数
每个 TreeBuilder 根据其使用的解析器具有不同的特征,因此输入内容根据传递给构造器的 features 参数会产生不同结果。 在 Beautiful Soup 模块中,TreeBuilder 当前支持的解析器如下:
- lxml
- html5lib
- html.parser
BeautifulSoup 构造器的 features 参数可接受字符串列表或单个字符串值。
当前,每个 TreeBuilder 支持的 features 参数和对应解析器如下表所示:
| Features | TreeBuilder | Parser |
|---|---|---|
| [‘lxml','html','fast','permissive'] | LXMLTreeBuilder | lxml |
| [‘html','html5lib','permissive','strict','html5′] | HTML5TreeBuilder | html5lib |
| [‘html','strict','html.parser'] | HTMLParserTreeBuilder | html.parser |
| [‘xml','lxml','permissive','fast'] | LXMLTreeBuilderForXML | lxml |
根据指定的 feature 参数,Beautiful Soup 会选择最合适的 TreeBuilder 类。若指定解析器时出现如下报错信息,通常意味着需要安装对应的解析器库。
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?
对于 HTML 文档,TreeBuilder 的选择顺序基于解析器的优先级,如上表所示。优先级顺序为:lxml 最高,其次是 html5lib,最后是 html.parser。例如,若选择 html 字符串作为 feature 参数,且 lxml 解析器可用,则 Beautiful Soup 模块将选择 LXMLTreeBuilder。若 lxml 不可用,则根据 html5lib 解析器选择 HTML5TreeBuilder。若仍不可用,则根据 html.parser 选择 HTMLParserTreeBuilder。
至于 XML,由于 lxml 是唯一支持的解析器,因此 LXMLTreeBuilderForXML 总是会被选中。
因此,为 XML 创建 Beautiful Soup 对象的代码如下:
helloworld = '<p>Hello World</p>' soup_string = BeautifulSoup(helloworld,features="xml") print soup_string
输入的结果也是 XML 形式的文件 :
在创建 Beautiful Soup 对象时,推荐的做法是指定解析器。这是因为不同解析器的解析结果差异显著,特别是在处理非法 HTML 文档时,结果差异更为明显。
当我们创建 BeautifulSoup 对象时,Tag 和 NavigableString 对象也随之创建。
创建 Tag 对象
我们可以从 BeautifulSoup 对象中获取 Tag 对象,即 HTML/XML 中的标签。
如下 HTML 代码所示:
#!/usr/bin/python # -*- coding:utf-8 -*- from bs4 import BeautifulSoup html_atag = """ <html> <body> <p>Test html a tag example</p> <a href="http://www.glumes.com'>Home</a> <a href="http;//www.glumes.com/index.html'>Blog</a> </body> <html> """ soup = BeautifulSoup(html_atag,'html.parser') atag = soup.a print type(atag) print atag
从结果中可以看到 atag 的类型是 <class 'bs4.element.Tag'> 。而 soup.a 的结果就是 HTML 文档中的第一个 <a> 标签。 HTML/XML 标签对象具有名称和属性。名称即标签的名字,例如 <a> 标签的名称为 a 。属性包括 class 、id 、style 等。Tag 对象允许我们获取 HTML 标签的名称和属性 。
Tag 对象的名称
通过 .name 方式获取 Tag 对象的名称 。
tagname = atag.name print tagname
同时也能改变 Tag 对象的名称:
atag.name = 'p'
这样就将上面 HTML 文档中的第一个 <a> 标签名称换成了 <p> 标签了。
Tag 对象的属性
在 HTML 页面中,标签可能拥有不同属性,例如 class 、id 、style 等。Tag 对象能以字典形式访问标签的属性。
atag = soup_atag.a print atag
也能通过 .attrs 的方式访问,这样会将所有属性内容打印出来 :
print atag.attrs
{'href': u'http://www.glumes.com'}
创建 NavigableString 对象
NavigableString 对象持有 HTML 或 XML 标签的文本内容,这是一个 Unicode 编码的字符串。
我们可以通过 .string 的方式获取标签的文本内容 。
navi = atag.string print type(navi) print navi.string
小结
代码小结如下:
BeautifulSoup
soup = BeautifulSoup(String)soup = BeautifulSoup(String,features=”xml”)
Tag
tag = soup.tagtag.nametag[‘attribute']
NavigableString
soup.tag.string
总结
以上就是关于Python使用Beautiful Soup模块创建对象的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













