«

Python爬虫网页元素定位的方法

时间:2024-3-28 09:13     作者:韩俊     分类: Python


这篇文章主要介绍“Python爬虫网页元素定位的方法”,在日常操作中,相信很多人在Python爬虫网页元素定位的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python爬虫网页元素定位的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

官方站点:

www.crummy.com/software/BeautifulSoup/

Beautiful Soup 在 Python 爬虫圈知名度极高,而且非常好用,它是一款 Python 解析库,主要用于将 HTML 标签转换为 Python 对象树,然后让我们从对象树中提取数据。

模块的安装及其简单:

pip install bs4 -i 国内任意源即可

未来安装任何模块,都尽量使用国内源,速度快稳定。

该模块包名称为 bs4,安装的时候需要特别注意下。

基础用法如下所示

import requests
from bs4 import BeautifulSoup
def ret_html():
    """获取HTML元素"""
    res = requests.get('https://www.crummy.com/software/BeautifulSoup/', timeout=3)
    return res.text
if __name__ == '__main__':
    html_str = ret_html()
    soup = BeautifulSoup(html_str, 'lxml')
    print(soup)

其中需要注意的就是模块导入代码,以及实例化 

soup
 对象时,在 
BeautifulSoup
 类的构造函数中传递的两个参数,一个是待解析的字符串,另一个是解析器,官方建议的是 
lxml
,因其解析速度快。

上述代码输出的内容如下所示,看上去就是普通的 HTML 代码文件。

而且我们可以调用 

soup
 对象的 
soup.prettify()
 方法,可以将 HTML 标签进行格式化操作,这样你就可以在存储到外部文件的时候,让其 HTML 代码进行美观。

BeautifulSoup 模块的对象说明

BeautifulSoup 类可以将 HTML 文本解析成 Python 对象树,而这里面又包括最重要的四种对象,分别是 

Tag
,
NavigableString
,
BeautifulSoup
,
Comment
 对象,接下来我们一一介绍。

BeautifulSoup 对象

该对象本身就代表整个 HTML 页面,而且实例化该对象的时候,还会自动补齐 HTML 代码。

    html_str = ret_html()
    soup = BeautifulSoup(html_str, 'lxml')
    print(type(soup))

Tag 对象

Tag 是标签的意思,Tag 对象就是网页标签,或者叫做网页元素对象,例如获取 bs4 官网的 h2 标签对象,代码如下所示:

if __name__ == '__main__':
    html_str = ret_html()
    soup = BeautifulSoup(html_str, 'lxml')
    # print(soup.prettify())  # 格式化 HTML
    print(soup.h2)

得到的也是网页中的 h2 标签:

<h2>Beautiful Soup</h2>

用 Python 中的 type 函数,可以查看其类型,代码如下:

    print(soup.h2)
    print(type(soup.h2))

此时得到的可不是一个字符串,而是一个 Tag 对象。

<h2>Beautiful Soup</h2>
<class 'bs4.element.Tag'>

既然是 Tag 对象,那就会具备一些特定的属性值

获取标签名称

    print(soup.h2)
    print(type(soup.h2))
    print(soup.h2.name)  # 获取标签名称

通过 Tag 对象获取标签的属性值

 print(soup.img)  # 获取网页第一个 img 标签
 print(soup.img['src'])  # 获取网页元素DOM的属性值

通过 attrs 属性获取标签的所有属性

print(soup.img)  # 获取网页第一个 img 标签
print(soup.img.attrs)  # 获取网页元素的所有属性值,以字典形式返回

以上代码的所有输出如下所示,可以任意选择标签进行练习。

<h2>Beautiful Soup</h2>
<class 'bs4.element.Tag'>
h2
<img align="right" src="10.1.jpg" width="250"/>
{'align': 'right', 'src': '10.1.jpg', 'width': '250'}

NavigableString 对象

NavigableString 对象获取的是标签内部的文字内容,例如

p
标签,在下述代码中提取的是
我是橡皮擦

<p>我是橡皮擦</p>

获取该对象也非常容易,使用 Tag 对象的 string 属性即可。

    nav_obj = soup.h2.string
    print(type(nav_obj))

输出结果如下所示:

<class 'bs4.element.NavigableString'>

如果目标标签是一个单标签,会获取到 None 数据

除了使用对象的

string
方法外,还可以使用
text
属性和
get_text()
方法来获取标签内容

    print(soup.h2.text)
    print(soup.p.get_text())
    print(soup.p.get_text('&'))

其中 

text
是获取所有子标签内容的合并字符串,而
get_text()
也是相同的效果,不过使用
get_text()
可以增加一个分隔符,例如上述代码的
&
符号,还可以使用,strip=True 参数去除空格。

Comment 对象

BeautifulSoup 对象和 Tag 对象支持标签查找方法,具体内容如下所示。

find() 方法和 find_all() 方法

调用 BeautifulSoup 对象和 Tag 对象的

find()
方法,可以在网页中找到指定对象,

该方法的语法格式如下:

obj.find(name,attrs,recursive,text,**kws)

方法的返回结果是查找到的第一个元素,如果没查询到,返回 None。 参数说明如下:

  • name
    :标签名称;

  • attrs
    :标签属性;

  • recursive
    :默认搜索所有后代元素;

  • text
    :标签内容。

例如我们继续在上文请求的网页中,查找

a
标签,代码如下:

html_str = ret_html()
soup = BeautifulSoup(html_str, 'lxml')
print(soup.find('a'))

也可以使用

attrs
参数进行查找,代码如下:

html_str = ret_html()
soup = BeautifulSoup(html_str, 'lxml')
# print(soup.find('a'))
print(soup.find(attrs={'class': 'cta'}))

find()
方法还提供了一些特殊的参数,便于直接查找,例如可以使用
id=xxx
,查找属性中包含 
id
的标签,可以使用
class_=xxx
,查找属性中包含
class
的标签。

print(soup.find(class_='cta'))

与

find()
方法成对出现的是
find_all()
方法,看名称就能知道其返回结果收是全部匹配标签,语法格式如下:

obj.find_all(name,attrs,recursive,text,limit)

其中重点说明一下

limit
参数,它表示最多返回的匹配数量,
find()
方法可以看作
limit=1
,这样就变得容易理解了。

标签: python

热门推荐