0

我刚刚写了一个简单的 python 程序来从谷歌新闻中提取链接,这是成功的。我现在遇到的问题是我想将所有这些链接写入或附加到文本文件中,但它只写入第一个链接而不是所有链接。我如何实现这一点?

我的代码如下所示

from urllib.request import urlopen
from bs4 import BeautifulSoup as Soup


class Scraper:
    def __init__(self, site):
        self.site = site

    def scrape(self):
        req = urlopen(self.site)
        html = req.read()
        parser = "html.parser"
        sp = Soup(html, parser)
        news_list = sp.find_all("a")
        for tag in news_list:
            url = tag.get("href")
            print("\n", url)
            print("-" * 110)
            with open("elder.txt", "w+") as f:
                f.write(str(url))

news = "https://news.google.com"
Scraper(news).scrape()
4

3 回答 3

2

您的代码中的问题是您在循环内打开了一个文件。这是什么意思?,当你用“w+”模式打开文件时,它会删除文件以前的数据(只需重写它)。顺便说一句,您使用了错误的模式,“w+”用于写入和读取(两者)。您需要使用“w”模式(仅写入)并将其放在循环之前,因为我们希望对所有循环过程使用相同的文件并写入您理解的相同位置。

您需要的代码:

def scrape(self):
    req = urlopen(self.site)
    html = req.read()
    parser = "html.parser"
    sp = Soup(html, parser)
    news_list = sp.find_all("a")
    with open("elder.txt", "w") as f:
        for tag in news_list:
            url = tag.get("href")
            print("\n", url)
            print("-" * 110)

            f.write(str(url))
于 2020-07-05T07:56:21.457 回答
2

问题是您没有始终打开文件。对于 for 循环中的每次迭代,您都将其打开一次。

在整个功能中保持打开状态,它会起作用。

from urllib.request import urlopen
from bs4 import BeautifulSoup as Soup


class Scraper:
    def __init__(self, site):
        self.site = site
    def scrape(self):
        with open("elder.txt", "w+") as f:
            req = urlopen(self.site)
            html = req.read()
            parser = "html.parser"
            sp = Soup(html, parser)
            news_list = sp.find_all("a")
            for tag in news_list:
                url = tag.get("href")
                print("\n", url)
                print("-" * 110)
                f.write(str(url) + '\n')

news = "https://news.google.com"
links = Scraper(news).scrape()

尝试这个。

于 2020-07-05T07:53:29.710 回答
1

您需要更早地打开文件,而不是在写入每个 url 之前打开它。

您当前所拥有的只是将文件打开一个新的,在您编写之前将其清除。

with open("elder.txt", "w+") as f:
    for tag in news_list:
        url = tag.get("href")
        print("\n", url)
        print("-" * 110)
        f.write(str(url))

或使用:open("elder.txt", "a")每次运行脚本时附加到文件。

于 2020-07-05T07:53:25.873 回答