Python 3.x 在抓取Python3时只将头文件写入CSV一次

Python 3.x 在抓取Python3时只将头文件写入CSV一次,python-3.x,csv,web-scraping,beautifulsoup,with-statement,Python 3.x,Csv,Web Scraping,Beautifulsoup,With Statement,所以,我正在做一门关于Python3的课程,在“抓取”部分,我们有一个任务,抓取网站,获取所有引用的文本、作者和作者简历链接,包括“下一页”上的引用。我已经这样做了,但在我进入每一个新页面后,我会得到一行空行,这是我最初设想的标题 import requests from bs4 import BeautifulSoup import csv from time import sleep base_url = "http://quotes.toscrape.com" url

所以,我正在做一门关于Python3的课程,在“抓取”部分,我们有一个任务,抓取网站,获取所有引用的文本、作者和作者简历链接,包括“下一页”上的引用。我已经这样做了,但在我进入每一个新页面后,我会得到一行空行,这是我最初设想的标题

import requests
from bs4 import BeautifulSoup
import csv
from time import sleep

base_url = "http://quotes.toscrape.com"
url = "/page/1"

f = open("scraping_project_final.csv", "w")
f.truncate()
f.close()

while url:

    with open("scraping_project_final.csv", "a") as file:
        csv_writer = csv.writer(file)
        csv_writer.writerow(["text", "name", "url"])

        response = requests.get(f"{base_url}{url}")
        print(f"Scraping {base_url}{url}")
        soup = BeautifulSoup(response.text, "html.parser")
        quotes = soup.find_all(class_="quote")

        for quote in quotes:
            txt = quote.find(class_="text").get_text()
            author = quote.find(class_="author").get_text()
            link = quote.find("a")["href"]
            csv_writer.writerow([txt, author, link])

        next_page = soup.find(class_="next")
        url = next_page.find("a")["href"] if next_page else None
    # sleep(2)
所以,我遇到的问题是,初始writerrow实际上每次迭代都会创建一个空行,如何避免这种情况?我希望继续使用这种方法,如果可能的话,不要使用DictReader。我在下面添加了一个图像,这是CSV输出。您可以看到,在十行之后,有一行只有:文本、名称、url


只打开文件一次,写入标题一次,然后在页面上循环。例如:

with open('scraping_project_final.csv', 'w', encoding='utf-8-sig', newline='') as file:
    csv_writer = csv.writer(file)
    csv_writer.writerow(['text', 'name', 'url'])

    while url:

        response = requests.get(f'{base_url}{url}')
        ...

不需要为每个页面重新打开文件,也不需要截断文件


注意
utf-8-sig
是在Excel中打开的最佳编码,因为它可以处理Unicode字符,
newline='
被记录为打开
csv.writer
文件的模式。

在while循环之前设置一个标志,然后仅在以前没有写过头的情况下才写头。然后把旗子翻过来

#。。。
第一页=假
而url:
打开(“scraping_project_final.csv”、“a”)作为文件:
csv\u writer=csv.writer(文件)
如果第一页:
csv_writer.writerow([“文本”、“名称”、“url”])
第一页=假
# ...

研究使用字典编写器编辑您的csv。不要手动写入标题。 (向下滚动至dict writer)

这是因为dict writer依赖于标题来附加/编辑您的csv值,您需要做的只是告诉dict writer您的标题是什么,如果需要,它将写入标题


显然,如果您只是循环,请将write头行放在循环之外,以便按照上面人员的建议只运行一次。这应该是解决问题的最简单方法。

在while循环前设置一个标志
first\u page=True
然后将
csv\u writer.writerow([“text”、“name”、“url”])
包装在
如果first\u page
语句中,并设置
first\u page=False
谢谢,将其作为答案发布,我将接受它。