如何在Python中动态地将HTML写入文件

时间:2017-11-15 06:54:05

标签: python html

我有以下代码:

for item in soup.select('.profile-detail'):
    f= open('htmlfile.html', 'w')
    f.write(item)
    f.close()

我想将项目写入“htmlfile.html”,但它给了我错误:

  

TypeError:write()参数必须是str,而不是Tag

2 个答案:

答案 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"的元素。鉴于此,您拥有的代码存在两个问题:

  1. item函数返回的列表中的值select()是Tag类的实例,文件对象的write方法需要字符串。作为@PRMoureu wrote,您可以将Tag实例强制转换为字符串,并通过用以下内容替换文件写入行来返回它所代表的原始HTML字符串:

    f.write(str(item))
    
  2. 您打开的文件在循环中以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