说说如何利用 Python 的 BeautifulSoup 模块解析 HTML 页面

BeautifulSoup 是 Python 的一个模块,用于从 HTML 页面中提取信息。

首先在命令行中运行 pip install beautifulsoup4 安装该模块,模块的名称是 bs4。

1 创建 BeautifulSoup 对象

调用 bs4. BeautifulSoup () 函数时,需要传入需要解析的 HTML 字符串。 bs4. BeautifulSoup () 函数会返回一个 BeautifulSoup 对象。

import requests,bs4

import logging
# logging.disable(logging.CRITICAL)
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

'''
解析 HTML
@author Deniro Li
'''

# 创建 BeautifulSoup 对象
res=requests.get('http://baijiahao.baidu.com/s?id=1661690064978679036')
res.raise_for_status()
soup=bs4.BeautifulSoup(res.text)
logging.debug(str(type(soup)))

运行结果:

<class ‘bs4.BeautifulSoup’>

这段代码利用 requests.get()函数从百度网站下载页面,然后将响应结果的 text 属性传递给 bs4.BeautifulSoup()。它返回的 BeautifulSoup 对象保存在变量 soup 中。

也可以向 bs4.BeautifulSoup() 传递一个 File 对象,从硬盘加载一个 HTML 文件。

有了BeautifulSoup 对象之后,我们就可以利用它的方法,定位出 HTML 文档中的特定部分。

2 搜索 HTML 元素

传入一个字符串作为 CSS选择器,调用 BeautifulSoup 的 select() 方法,就可以取到 Web 页面元素。选择器就像正则表达式:通过它们来指定需要寻找的模式。

CSS选择器示例

示例 说明
soup.select(‘div’) 所有名为<div>的元素
soup.select(’#title’) 带有 id 属性为 title 的元素
soup.select(’.message’) 所有使用 CSS class 属性名为 message 的元素
soup.select(‘div span’) 所有在<div>元素之内的<span>元素
soup.select(’div > span’) 所有在<div>元素之内的直接 <span>元素, 即没有其它中间元素
soup.select(‘input[name]’) 所有名为<input>,并有一个 name 属性,其值无所谓的元素
soup.select(‘input[type=“button”]’) 所有名为<input>,并有一个 type 属性,其值为 button 的元素

不同的选择器模式可以组合起来,形成复杂的匹配。例如, soup.select(‘p #author’) 将匹配所有在一个

元素之内并且 id 属性为 title 的元素。

select() 方法将返回一个 Tag 对象的列表, Tag 对象用于表示一个 HTML 元素。针对 BeautifulSoup 对象中的 HTML 的每次匹配,都会生成一个 Tag 对象,并放入列表中。 把 Tag 对象传递给 str() 函数,就可以得到它所代表的整个 HTML 标签字符串。 Tag 对象还包含 attrs 属性,它以字典的形式存放该 Tag 对象标签所拥有的所有 HTML 属性。

elems = soup.select('.bjh-p')
logging.debug('elems type -> ' + str(type(elems)))
logging.debug('len -> ' + str(len(elems)))
logging.debug('elem type -> ' + str(type(elems[0])))
logging.debug('elem -> ' + str(elems[0]))
logging.debug('elem text -> ' + str(elems[0].getText()))
logging.debug('elem attrs -> ' + str(elems[0].attrs))

运行结果:

通过 len(elems) 得知,这个 HTML 总共包含 47 个 Tag 对象。str(elems[0]) 可以得到包含开始和结束标签的整个标签字符串。

指定 elems 的 Tag 对象列表序号,就可以取到相应的 Tag 对象。比如我们想取第二个 Tag 对象,就可以这样写:

logging.debug('elem2 -> ' + str(elems[1]))
logging.debug('elem2 text -> ' + str(elems[1].getText()))
logging.debug('elem2 attrs -> ' + str(elems[1].attrs))

运行结果:

3 获取 HTML 元素属性值

利用 Tag 对象的 get() 方法可以很容易从元素中获取属性值。我们向该方法传入一个属性名称,它就会返回该属性的值。

elems = soup.select('li')
logging.debug('len -> ' + str(len(elems)))
elem = elems[0]
logging.debug('elem -> ' + str(elem))
attr=elem.get('data-rid')
logging.debug('attr -> ' + str(attr))

运行结果:

发布了671 篇原创文章 · 获赞 766 · 访问量 99万+

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/105025013