【问题标题】:Python Looping through urls in csv file returns \ufeffhttps://Python 循环遍历 csv 文件中的 url 返回 \ufeffhttps://
【发布时间】:2020-11-06 00:34:00
【问题描述】:

我是 python 新手,我正在尝试遍历 csv 文件中的 url 列表并使用 BeautifulSoup 抓取网站 title,然后我想将其保存到文件 Headlines.csv .但我无法抓取网页title。如果我使用带有单个 url 的变量,如下所示:

url = 'https://www.space.com/japan-hayabusa2-asteroid-samples-landing-date.html'

resp = req.get(url)
soup = BeautifulSoup(resp.text, 'lxml')

print(soup.title.text)

它工作得很好,我得到了标题Japanese capsule carrying pieces of asteroid Ryugu will land on Earth Dec. 6 | Space
但是当我使用循环时,

import csv
with open('urls_file2.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for url in reader:
        print(url)
        resp = req.get(url)
        soup = BeautifulSoup(resp.text, 'lxml')

        print(soup.title.text)

我得到以下信息 ['\ufeffhttps://www.foxnews.com/us/this-day-in-history-july-16']

还有一条错误消息

InvalidSchema: No connection adapters were found for "['\\ufeffhttps://www.foxnews.com/us/this-day-in-history-july-16']"

我不确定我做错了什么。

【问题讨论】:

    标签: python loops csv url beautifulsoup


    【解决方案1】:

    正如前面的答案已经提到的“\ufeff”,您需要更改编码。

    第二个问题是,当您读取 CSV 文件时,您会得到一个列表,其中包含每一行的所有列。这里的关键字是列表。您正在向请求传递列表而不是字符串。

    根据您给出的示例,我假设您的网址位于 csv 的第一列。 Python 列表以 0 而不是 1 的索引开始。因此,要提取 url,您需要提取 0 的索引,它指的是第一列。

    import csv
    
    with open('urls_file2.csv', newline='', encoding='utf-8-sig') as f:
        reader = csv.reader(f)
        for url in reader:
            print(url[0])
    

    要了解更多关于列表的信息,您可以参考here。 您可以在 CSV 文件中添加更多列并进行试验以查看结果的显示方式。 如果您想在阅读每一行时参考列名,可以参考here

    【讨论】:

      【解决方案2】:

      您从文件中解析的 URL 上有一个字节顺序标记 \\ufeff。 看起来您的文件是签名文件,并且具有类似 utf-8-sig 的编码。

      您需要阅读带有encoding='utf-8-sig'的文件

      阅读更多here

      【讨论】:

      • 谢谢我昨天遇到了你链接的问题,我不确定要使用哪个编解码器。我使用了您的编码,以及 Raymond C. 建议的解决方案,它有效!
      猜你喜欢
      • 2020-10-29
      • 2020-06-25
      • 2014-04-10
      • 1970-01-01
      • 2019-12-13
      • 2018-02-07
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多