【问题标题】:How to fix : TypeError: normalize() argument 2 must be str, not list如何解决:TypeError: normalize() argument 2 must be str, not list
【发布时间】:2019-09-14 15:52:41
【问题描述】:

我正在进行一个 api 调用,从 ...url/articles.json 中提取所需的端点并将其转换为 csv 文件。我的问题是 ['labels_name'] 端点是一个具有多个值的字符串。(一篇文章可能有多个标签) 如何在不出现此错误的情况下提取字符串的多个值。 "File "articles_labels.py", line 40, in <module> decode_3 = unicodedata.normalize('NFKD', article_label) TypeError: normalize() argument 2 must be str, not list"?

import requests
import csv
import unicodedata
import getpass

url = 'https://......./articles.json'
user = ' '
pwd = ' '
csvfile = 'articles_labels.csv'

output_1 = []
output_1.append("id")
output_2 = []
output_2.append("title")
output_3 = []
output_3.append("label_names")
output_4 = []
output_4.append("link")

while url:
    response = requests.get(url, auth=(user, pwd))
    data = response.json()
    for article in data['articles']:
        article_id = article['id']
        decode_1 = int(article_id)
        output_1.append(decode_1)

    for article in data['articles']:
        title = article['title']
        decode_2 = unicodedata.normalize('NFKD', title)
        output_2.append(decode_2)

    for article in data['articles']:
        article_label = article['label_names']
        decode_3 = unicodedata.normalize('NFKD', article_label)
        output_3.append(decode_3) 

    for article in data['articles']:
        article_url = article['html_url']
        decode_3 = unicodedata.normalize('NFKD', article_url)
        output_3.append(decode_3)

    print(data['next_page'])
    url = data['next_page']

print("Number of articles:")
print(len(output_1))   

with open(csvfile, 'w') as fp:
    writer = csv.writer(fp,dialect = 'excel')
    writer.writerows([output_1])
    writer.writerows([output_2])
    writer.writerows([output_3])
    writer.writerows([output_4])

【问题讨论】:

  • 当您将title 传递给unicodedate.normalize() 函数时,错误消息意味着title 是一个列表,而不是字符串。您能否尝试打印出此时 title 是什么?
  • 回溯(最近一次调用最后一次):文件“articles_labels.py”,第 40 行,在 decode_3 = unicodedata.normalize('NFKD', article_label) TypeError: normalize() argument 2 must是 str,而不是列表
  • title 是一个字符串,当我运行它时它会打印出来。唯一的问题是根据文档的 label_names 也是一个字符串。但在这种情况下,它有多个值。如我说..就我而言..一篇文章可能有多个标签。

标签: python python-3.x python-requests


【解决方案1】:

我的问题是 ['labels_name'] 端点是一个具有多个值的字符串。(一篇文章可能有多个标签)如何提取字符串的多个值

这是一个列表而不是字符串,因此您没有“具有多个值的字符串”,您已经拥有多个字符串的列表。

问题是你想用它们做什么,CSV 肯定不会处理这个问题,所以你必须决定一种将字符串列表序列化为单个字符串的方法,例如通过将它们连接在一起(使用空格或逗号等分隔符)或仅选择第一个(注意处理没有的情况),......无论哪种方式,问题都不是真正的技术问题。

【讨论】:

  • 嘿.. 谢谢你的回答.. 我刚刚通过 list() 而不是 unicodedata.normalize () 并且它有效.. 对于那些没有标签的文章我刚刚得到空括号。
【解决方案2】:

unicodedata.normalize 采用 unicode 字符串,而不是错误所述的列表。使用unicodedata.normalize 的正确方法是(示例取自How does unicodedata.normalize(form, unistr) work?

from unicodedata import normalize

print(normalize('NFD', u'\u00C7'))
print(normalize('NFC', u'C\u0327'))
#Ç
#Ç

因此您需要确保 unicodedata.normalize('NFKD', title) 的标题为 unicode 字符串

【讨论】:

    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多