【问题标题】:Python passing a list from a file to requests.get()Python 将文件中的列表传递给 requests.get()
【发布时间】:2020-08-09 08:46:03
【问题描述】:

我正在尝试抓取新闻文章的语料库进行分析。我有一个带有 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 是问题所在。我尝试将所有链接一起运行,但没有成功。同样为了可读性,我更喜欢将每个链接放在单独的行上。 任何有关如何解决此问题的建议将不胜感激。谢谢。

【问题讨论】:

  • 您是否尝试使用 str 方法删除 \n。 rstrip('\n') ?
  • 所以我尝试了page_url = url_list.rstrip("\n") 导致“AttributeError:'list' 对象没有属性'rstrip'”。我还尝试了r = requests.get(page_url.rstrip("\n")),它产生了同样的错误。阅读 rstrip() 似乎是正确的,但我还不确定在哪里放置它。有什么想法吗?
  • 亲爱的@Sureshmani,这成功了!我的问题是我不知道如何正确使用它。但是,我摆弄了一下,偶然发现了一个解决方案,我将在下面发布。谢谢你的好主意。

标签: python web-scraping python-requests


【解决方案1】:

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

urls = list(f)

应该是这样的

urls = f.readlines()

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

【讨论】:

  • 感谢您的想法。我不知道 readlines()。不幸的是,f.readlines() 仍然留下 "\n" 与 list(f) 一样。我看不出输出有什么不同。似乎拆分可能是解决此问题的一种方法,但我并不完全确定。我会继续寻找,谢谢。
【解决方案2】:

使用 .rstrip() 删除“\n”解决了这个问题。下面的代码正在运行,并将一组新闻项正确写入单个文本文件。

import requests
from bs4 import BeautifulSoup

f = open('article-list.txt', 'r')
urls_n = list(f)
urls = [url.rstrip("\n") for url in urls_n]

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", "a")
    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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2021-01-09
    相关资源
    最近更新 更多