首页 > 解决方案 > Python 将文件中的列表传递给 requests.get()

问题描述

我正在尝试抓取新闻文章的语料库进行分析。我有一个带有 URL 列表的文本文件,我正在尝试将这些传递给请求,以便可以使用 BeautifulSoup 抓取页面。我可以从文本文件中提取网址。但是,我没有正确地将输出传递给 requests.get()。当我给 requests.get() 一个明确的 url 时,脚本可以正常工作。如何正确地将文本文件中的链接列表传递给 requests.get()?这是我的工作。

import requests
from bs4 import BeautifulSoup
r = requests.get("https://examplewebsite.org/page1")
coverpage = r.content
soup = BeautifulSoup(coverpage, 'html5lib')
file = open("output.txt", "w")
file.write("ITEM:")
paragraphs = soup.find_all("p")[11:-10]
for paragraph in paragraphs:
    file.write(paragraph.get_text())
    file.write("\n")
    file.write("\n")
file.close()

但是,当我尝试从作为链接列表的文本文件中读取时,我将链接传递给 requests.get() 的方式似乎存在问题。每行一个 URL,链接的文本文件列表看起来像

https://examplewebsite.org/page1
https://examplewebsite.org/page2
https://examplewebsite.org/page3
https://examplewebsite.org/page4

这是我试图通过链接列表工作的方式。

f = open('article-list.txt', 'r')
urls = list(f)
for url in urls:
    import requests
    from bs4 import BeautifulSoup
    r = requests.get(url)
    coverpage = r.content
    soup = BeautifulSoup(coverpage, 'html5lib')
    file = open("output.txt", "w")
    file.write("ITEM:")
    paragraphs = soup.find_all("p")[11:-10]
    for paragraph in paragraphs:
        file.write(paragraph.get_text())
        file.write("\n")
        file.write("\n")
        print(paragraph.get_text())
file.close()

我得到的是一个错误说

AttributeError: 'NoneType' object has no attribute 'get_text'

这表明我没有正确传递请求。如果我只是简单地交换一个明确定义的 url,比如“ https://somewebsite.org/page1 ”,那么脚本就会工作并将段落写入文件。然而,当我print(urls)在顶部放置一个语句并为 requests.get() 提供一个明确的链接以使其不会中断时,我得到了一个 url 列表。但是,该列表的格式为:

[' http://examplewebsite.org/page1 \n', ' http://examplewebsite.org/page2 \n', ' http://examplewebsite.org/page3 \n']

我认为\n是问题所在。我尝试将所有链接一起运行,但没有成功。同样为了可读性,我更喜欢将每个链接放在单独的行上。任何有关如何解决此问题的建议将不胜感激。谢谢。

标签: pythonweb-scrapingpython-requests

解决方案


为了像在文件中一样获取列表,这一行

urls = list(f)

应该是这样的

urls = f.readlines()

它将返回 txt 文件中每一行的数组,不带任何“\n”


推荐阅读