python写入文件报错TypeError: must be str, not list

将一个转化为 string 的 list 存入 txt 时候报错,存储函数如下:

def saveFile(data, name):
    path = "E:\\sxks\\JavaProblems\\" + name + ".txt"
    data.encode("utf-8")
    f = open(path, 'wb+')
    f.write(data)
    f.close()

list 转化 string 代码如下:

sdata = []

for p in list:
    sdata.append(p.text)
    
s = '\n'.join(sdata)

str(sdata)也尝试过了,错误依旧, 请问是什么问题?

完整代码如下:

import urllib.request
from urllib.parse import urljoin
import time
from bs4 import BeautifulSoup


def saveFile(data, name):
    path = "E:\\sxks\\JavaProblems\\" + name + ".txt"
    print(path)
    data.encode("utf-8")
    f = open(path,'wb')
    f.write(data)
    f.close()

urllist=[]
for i in range(1,8):
    if i==1:
        urlx="http://www.233.com/ncre2/JAVA/moniti/index.html"
        urllib.parse.quote(urlx)
        urllist.append(urlx)
        break
    urlx="http://www.233.com/ncre2/JAVA/moniti/index0"+i+".html"
    urllib.parse.quote(urlx)
    urllist.append(urlx)

for url in urllist:
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    req = urllib.request.Request(url=url, headers=headers)
    res = urllib.request.urlopen(req)
    res.encoding = 'utf-8'
    data = res.read()
    soup = BeautifulSoup(data, "html.parser")
    lista = []
    lista = soup.select('ul.fl.f14.list-box.best-list.mt10 li a')
    print("result len is", len(lista))
    urls = []
    for li in lista:
        urls.append(li['href'])
    for r in urls:
        req = urllib.request.Request(url=r, headers=headers)
        res = urllib.request.urlopen(req)
        data = res.read()
        soup = BeautifulSoup(data, "html.parser")
        name = soup.select('h2')
        listp = []
        listp = soup.select('.newsArea-2nd-PageWord p')
        sdata = []
        for p in listp:
            sdata.append(p.text)
        s = '\n'.join(sdata)
        str(s)
        saveFile(s, name)
        print(name[0].text + "保存成功")
        time.sleep(1)
time.sleep(1)

打印 s 的类型确实是 str

阅读 9.2k
2 个回答

你还是把完整代码和报错贴出来吧,这么前后不搭的看不什么.比如那个for循环里的list是什么,里面是什么数据?
另外list跟内置类重名了

两个错误:
1.saveFile(s,name)
这里name还是一个tag的list对象,需要name[0].text

2.data.encode('utf-8')
这里需要重新赋值一下,encode()是不会改变原来的字符串的(字符串是不可变对象)
data = data.encode('utf-8')

你的 name 不是 str 喔!

我試著跑的結果:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-d43d76cb2656> in <module>()
     51         s = '\n'.join(sdata)
     52         str(s)
---> 53         saveFile(s, name)
     54         print(name[0].text + "保存成功")
     55         time.sleep(1)

<ipython-input-15-d43d76cb2656> in saveFile(data, name)
      6 
      7 def saveFile(data, name):
----> 8     path = name + ".txt"
      9     print(path)
     10     data.encode("utf-8")

TypeError: can only concatenate list (not "str") to list
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题