遇到“NavigableString“object has no attribute “text“的解决方法(全)

NavigableString 在BeautifulSoup对象中,是表示解析树中的文本内容。

可以按照字面意义上理解为可遍历字符串,是BeautifulSoup对象四种类型之一, 属于bs4.element.NavigableString

和另一种常见到的 bs4.element.Tag不同。Tag是可以通过.text 获取文本,通过a.attrs[‘href’] 来获得href,而NavigableString不能。

它们是 解析网页源码 HTML 或 XML 文档后,生成的四种类型:

Tag:表示文档中的一个标签(如 <a>、<p>、<div> 等)。每个 Tag 对象都有属性和子元素,可以通过它们访问标签的内容和属性。

NavigableString:表示标签内的文本内容。它是一个字符串类型的对象,包含标签内的文本。

BeautifulSoup:表示整个文档的对象。它是一个特殊的 Tag 对象,通常用于解析整个 HTML 或 XML 文档。

Comment:表示 HTML 注释。它是一个特殊类型的 NavigableString,包含注释的内容。

有时候在获取json格式,解析BeautifulSoup的时候,可能会遇到这个问题:

‘NavigableString’ object has no attribute ‘text’

那可能是在 NavigableString 对象上调用 .text 属性,因此就会出现 的错误。

以下是一些解决这个问题的方法:

1. 使用string转换为字符串

bs4.element.NavigableString是通过.string来调用的,用来获取便签内部的文字内容,而不是用text。

string_ = soup.div.b.string
text = str(string_ )
print(text)  

2. 通过父标签获取文本

如果你尝试获取一个标签内的文本,应该使用其 父标签.text 属性,而不是 NavigableString 对象的属性。例如:

from bs4 import BeautifulSoup

html = '<div>Some text <b>and some bold text</b></div>'
soup = BeautifulSoup(html, 'html.parser')
div_text = soup.div.text
print(div_text) 
# 输出: 'Some text and some bold text'

3. 使用prettify()打印和清除空白内容

如果你不确定如何获取文本,可以打印整个解析树来查看结构:

print(soup.prettify())

prettify() 可以将所有节点变得格式化,规范化, 这可以比较直观看到整个html的结构NavigableString 对象在文档中的位置,但是它最后会输出成str。

详细写法:

在这里插入图片描述

如果检查规范后的源码,发现 NavigableString 对象的文本可能包含额外的空格或换行符的话,可以使用 .strip() 方法,来清除这些空白字符:

stripped_text = nav_string.strip()
print(stripped_text)

4. 遍历整个解析树

如果需要从复杂的 HTML 文档中提取文本,可以遍历解析树并收集所有 NavigableString 对象的文本,并以列表的形式展示:

texts = [element.strip() for element in soup.div.descendants if isinstance(element, NavigableString)]

这个方法后期需要对内容做for遍历全部内容,而且会占运行空间,如果内容比较大的话,不是很建议用。但是可以对一些复杂或者文本换行不明显的HTML,做这样的一步!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值