Python将列表从文件传递到request.get()

时间:2020-04-25 19:06:01

标签: python web-scraping python-requests

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

但是,当我尝试从包含链接列表的文本文件中读取内容时,如何将链接传递给request.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'

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

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

我认为是 \ n 。我尝试同时运行所有链接,但没有用。同样为了提高可读性,我更希望每个链接都放在单独的行上。 任何有关解决此问题的建议将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:0)

为了获得与文件中​​相同的列表,请在此行

urls = list(f)

应该看起来像这样

urls = f.readlines()

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

答案 1 :(得分:0)

使用.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()