url在Python中编码列表

问题描述 投票:0回答:2

我是一个noobie,我一直在努力研究这个简单的代码,所以我想我会寻求帮助。

我正在尝试打开CSV并解码网址文字,例如example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0然后保存文件。我可以使用字符串轻松完成此操作,但我很难用CSV中的行来完成。

我到目前为止的尝试:

#reading
file1 = open('example.csv', 'r')
reader = csv.reader(file1)
url = []
for rows in reader:
    url.append = urllib.unquote(rows).decode('utf8')
    #also tried "url.append(urllib.unquote(rows).decode('utf8'))", but same error
file1.close() 

#writing
file2 = open('example.csv', 'w')
writer = csv.writer(file2)
writer.writerows(url)
file2.close()

编辑:我收到的错误..

AttributeError: 'list' object has no attribute 'split'
python urllib urldecode
2个回答
1
投票

你的方法有一些错误。

  1. 您似乎没有CSV,但是每行有一个值的常规文本文件。在这里使用csv模块没有任何好处,Python可以很好地读取文本文件。实际上,当您打开文本文件进行阅读时,“逐行”默认模式。
  2. 当您读取或写入任何文本文件时,必须在open()时声明文本文件所在的编码。 Python没有魔术文本编码检测器,当你没有指定编码时,正确读取文件可能在你的机器上运行而在另一台机器上运行,因为不同的计算机配置可能有不同的“默认”编码。
  3. URL是复杂的数据结构,对它们应用“urldecode”是不够的。您需要解析它们 - 幸运的是,URL解析器内置于Python中。 URL解析器将为您提供一个ParseResult对象,该对象可以方便地将URL的所有不同部分公开为属性。
  4. URL由许多部分组成,查询字符串是其中之一。
  5. 查询字符串是复杂的数据结构,对它们应用“urldecode”是不够的。您需要解析它们 - 幸运的是,查询字符串解析器内置于Python中。查询字符串解析器将自动为您解码值,并为您提供可以使用密钥访问的dict
  6. .append是一个功能。你不能分配给它(.append = '...'),你需要调用它(.append('...'))。
  7. 最后,使用with块更容易处理文件,因为with会自动关闭文件。

相比:

from urllib.parse import urlparse, parse_qs

with open('example.txt', 'r', encoding='utf-8') as file1:
    titles = []

    for url in file1:
        parts = urlparse(url)
        # -> ParseResult(
        #      scheme='http', netloc='example.com', path='', params='',
        #      query='title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0',
        #      fragment='')

        q = parse_qs(parts.query)
        # -> {'title': ['правовая защита']}

        if 'title' in q:
            titles.append(q['title'][0])

    with open('titles.txt', 'w', encoding='utf-8') as file2:
        file2.writelines(titles)

使用list comprehensions并删除不必要的注释,我们可以压缩上面的代码:

from urllib.parse import urlparse, parse_qs

with open('example.txt', 'r', encoding='utf-8') as file1:
    queries = [parse_qs(urlparse(url).query) for url in file1]

with open('titles.txt', 'w', encoding='utf-8') as file2:
    titles = [q['title'][0] for q in queries if 'title' in q]
    file2.writelines(titles)

0
投票

对我而言,您可能会从阅读器中获取单独的行。我猜这些可能是通过索引提供的。

for row in reader
    url.append = urllib.unquote(row[0]).decode('utf8')

如果列表抽象还不够,还有一个DictReader

© www.soinside.com 2019 - 2024. All rights reserved.