BeautifulSoup报”AttributeError: ‘NavigableString’ object has no attribute ‘split’ “异常的原因以及解决办法

  • Post category:Python

首先,需要了解什么是BeautifulSoup:BeautifulSoup是一个用于解析HTML和XML文档的Python库,它使解析这些文件变得简单、直观,可以自己选择解析器,常用的解析器有lxml和html.parser。

在进行BeautifulSoup的使用过程中,经常会遇到”AttributeError: ‘NavigableString’ object has no attribute ‘split’ “的报错,这里详细分析一下原因及解决方案。

在使用BeautifulSoup解析HTML文档时,有时我们需要对其中的文本内容进行处理,例如进行字符串的拆分、替换、查找等操作。但如果某个元素中只包含文本内容,而没有标签等其他内容,则直接对该元素进行字符串操作会导致”AttributeError: ‘NavigableString’ object has no attribute ‘split’ “这样的错误,因为在BeautifulSoup中,纯文本内容会被解析为”bs4.element.NavigableString”类型的对象,而该类型的对象没有split等字符串操作的方法。

为了解决这个问题,我们需要添加额外的判断语句,判断当前处理的对象是否为文本内容。在BeautifulSoup中,可以使用.contents或.children等方法获取某个元素的子元素列表,如果该列表为空,说明该元素只包含文本内容。

下面是一个示例代码,演示了如何对包含文本内容的元素进行字符串拆分(以逗号为分隔符):

from bs4 import BeautifulSoup

html_text = '''
    <div class="content">
        美丽的中国,伟大的中华民族!
    </div>
'''

soup = BeautifulSoup(html_text, 'lxml')
div = soup.find('div', class_='content')
if len(div.contents) == 1:  # 如果只包含文本内容
    div_text = div.contents[0].strip()  # 获取文本内容并去除两端空格
    text_list = div_text.split(',')  # 以逗号为分隔符进行字符串拆分
    print(text_list)

输出结果为:

['美丽的中国', '伟大的中华民族!']

通过以上代码示例,可以清晰地看到如何通过添加判断语句,避免了”AttributeError: ‘NavigableString’ object has no attribute ‘split’ “的错误出现,成功对包含文本内容的元素进行了字符串拆分操作。