我有以下代码:
for item in soup.select('.profile-detail'):
f= open('htmlfile.html', 'w')
f.write(item)
f.close()
我想将项目写入“htmlfile.html”,但它给了我错误:
TypeError:write()参数必须是str,而不是Tag
答案 0 :(得分:3)
只需使用str()
即可获取整个代码内容:
with open('htmlfile.html', 'w') as f:
for item in soup.select('.profile-detail'):
f.write(str(item) + '\n') # thanks jeteon :p, it's cleaner
答案 1 :(得分:1)
我从你剪辑中的soup
收集到你正在使用BeautifulSoup来提取类别" profile-detail"的元素。鉴于此,您拥有的代码存在两个问题:
item
函数返回的列表中的值select()
是Tag类的实例,文件对象的write
方法需要字符串。作为@PRMoureu wrote,您可以将Tag实例强制转换为字符串,并通过用以下内容替换文件写入行来返回它所代表的原始HTML字符串:
f.write(str(item))
您打开的文件在循环中以write(" w")模式打开。这意味着对于循环的每次迭代,文件都将被覆盖,如果您尝试收集查询返回的所有元素,则只能获取最后一个。如果您想在文件中包含所有这些内容,以下是修复它的替代方法:
# Open the file in append mode
for item in soup.select('.profile-detail'):
f = open('htmlfile.html', 'a')
f.write(item)
f.close()
这并不太好,因为没有必要在每次迭代时打开和关闭文件。我们可以为所有写入保持文件打开:
# Open and close file just once
f = open('htmlfile.html', 'w') # Okay to open in write mode now
for item in soup.select('.profile-detail'):
f.write(item)
f.write('\n') # In case you're expecting each on a new line
f.close()
或者,我个人最喜欢的,做的几乎相同,但有上下文,所以你不要担心忘记f.close()
或意外地给它错误的缩进或稍后的东西:
# With contexts
with open('htmlfile.html', 'w') as f:
for item in soup.select('.profile-detail'):
f.write(item)
f.write('\n') # In case you're expecting each on a new line
# File is auto-magically closed by the time you get here