使用BeautifulSoup提取标签写入文件触发TypeError:需将Tag转为字符串
解决BeautifulSoup中Tag对象转字符串写入文件的问题
错误原因
你碰到的TypeError: write() argument must be str, not Tag,是因为soup.find_all()返回的是BeautifulSoup的Tag对象,而文件的write()方法只接受字符串类型。
为什么elem.text会返回空?
text属性是用来提取标签下的可见文本内容的,而application/ld+json类型的script标签里的内容属于标签的内部字符串,不属于普通可见文本范畴,所以用text拿不到内容。
正确解决方法
有两种常用方式:
- 如果你需要完整的script标签(包括标签本身和内部JSON内容),直接用
str()把Tag对象转成字符串:file.write(str(elem)) - 如果你只需要script标签里的JSON内容,用
elem.string获取标签内部的字符串(加个判断避免空标签报错):if elem.string: file.write(elem.string)
文档对应位置
在BeautifulSoup文档的**「NavigableString」章节,会介绍Tag对象的string属性用于获取标签包含的单个字符串;另外在「Tag对象」**章节,说明可以直接将Tag对象转换为字符串(Python的str()函数会调用Tag的__str__方法,返回对应的HTML字符串)。
修改后的完整代码
from bs4 import BeautifulSoup # 用with语句自动管理文件,不用手动close with open("meetup.html", "r") as html_file: soup = BeautifulSoup(html_file, 'html.parser') with open('myfile.txt', 'w') as output_file: for elem in soup.find_all(attrs={"type": "application/ld+json"}): # 只写入内部JSON内容 if elem.string: output_file.write(elem.string) # 若要写入完整script标签,替换成下面这行 # output_file.write(str(elem))
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

