Python 将数据写入csv

Python 将数据写入csv,python,csv,web-scraping,beautifulsoup,Python,Csv,Web Scraping,Beautifulsoup,我正在从维基百科上抓取数据,到目前为止它还可以工作。我可以在终端上显示它,但我不能按需要的方式将其写入csv文件:-/ 代码很长,但我还是把它贴在这里,希望有人能帮我 import csv import requests from bs4 import BeautifulSoup def spider(): url = 'https://de.wikipedia.org/wiki/Liste_der_Gro%C3%9F-_und_Mittelst%C3%A4dte_in_Deutsc

我正在从维基百科上抓取数据,到目前为止它还可以工作。我可以在终端上显示它,但我不能按需要的方式将其写入csv文件:-/ 代码很长,但我还是把它贴在这里,希望有人能帮我

import csv
import requests
from bs4 import BeautifulSoup


def spider():
    url = 'https://de.wikipedia.org/wiki/Liste_der_Gro%C3%9F-_und_Mittelst%C3%A4dte_in_Deutschland'
    code = requests.get(url).text  # Read source code and make unicode
    soup = BeautifulSoup(code, "lxml")  # create BS object

    table = soup.find(text="Rang").find_parent("table")
    for row in table.find_all("tr")[1:]:
        partial_url = row.find_all('a')[0].attrs['href']
        full_url = "https://de.wikipedia.org" + partial_url
        get_single_item_data(full_url)          # goes into the individual sites


def get_single_item_data(item_url):
    page = requests.get(item_url).text  # Read source code & format with .text to unicode
    soup = BeautifulSoup(page, "lxml")  # create BS object
    def getInfoBoxBasisDaten(s):
        return str(s) == 'Basisdaten' and s.parent.name == 'th'
    basisdaten = soup.find_all(string=getInfoBoxBasisDaten)[0]

    basisdaten_list = ['Bundesland', 'Regierungsbezirk:', 'Höhe:', 'Fläche:', 'Einwohner:', 'Bevölkerungsdichte:',
                        'Postleitzahl', 'Vorwahl:', 'Kfz-Kennzeichen:', 'Gemeindeschlüssel:', 'Stadtgliederung:',
                        'Adresse', 'Anschrift', 'Webpräsenz:', 'Website:', 'Bürgermeister', 'Bürgermeisterin',
                        'Oberbürgermeister', 'Oberbürgermeisterin']

    with open('staedte.csv', 'w', newline='', encoding='utf-8') as csvfile:
        fieldnames = ['Bundesland', 'Regierungsbezirk:', 'Höhe:', 'Fläche:', 'Einwohner:', 'Bevölkerungsdichte:',
                        'Postleitzahl', 'Vorwahl:', 'Kfz-Kennzeichen:', 'Gemeindeschlüssel:', 'Stadtgliederung:',
                        'Adresse', 'Anschrift', 'Webpräsenz:', 'Website:', 'Bürgermeister', 'Bürgermeisterin',
                        'Oberbürgermeister', 'Oberbürgermeisterin']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL, extrasaction='ignore')
        writer.writeheader()

        for i in basisdaten_list:
            wanted = i
            current = basisdaten.parent.parent.nextSibling
            while True:
                if not current.name:
                    current = current.nextSibling
                    continue
                if wanted in current.text:
                    items = current.findAll('td')
                    print(BeautifulSoup.get_text(items[0]))
                    print(BeautifulSoup.get_text(items[1]))
                    writer.writerow({i: BeautifulSoup.get_text(items[1])})

                if '<th ' in str(current): break
                current = current.nextSibling


print(spider())
导入csv
导入请求
从bs4导入BeautifulSoup
def spider():
url='1〕https://de.wikipedia.org/wiki/Liste_der_Gro%C3%9F-_在德国,这一比例为C3%A4dte
code=requests.get(url).text#读取源代码并生成unicode
soup=BeautifulSoup(代码,“lxml”)#创建BS对象
table=soup.find(text=“Rang”).find_parent(“table”)
对于表中的行。查找所有(“tr”)[1:]:
partial_url=row.find_all('a')[0]。attrs['href']
完整url=”https://de.wikipedia.org“+部分url”
获取单个项目数据(完整url)#进入各个站点
def获取单个项目数据(项目url):
page=requests.get(item_url).text#读取源代码并将.text格式转换为unicode
soup=BeautifulSoup(第页,“lxml”)#创建BS对象
def GetInfoboxBasisDatan(s):
return str(s)='Basisdaten'和s.parent.name=='th'
basisdaten=soup.find_all(string=getInfoBoxBasisDaten)[0]
basisdaten_list=['Bundesland'、'Regierungsbezirk:'、'Höhe:'、'Fläche:'、'Einwohner:'、'Bevölkerungsdichte:',
“Postleitzahl”、“Vorwahl:”、“Kfz Kennzeichen:”、“Gemeindeschlüssel:”、“Stadtgliedrung:”,
“Adresse”、“Anschrift”、“Webpräsenz:”、“Website:”、“Bürgermester”、“Bürgermesterin”,
“Oberbürgermester”,“Oberbürgermesterin']
将open('staedte.csv','w',newline='',encoding='utf-8')作为csvfile:
字段名=['Bundesland'、'Regierungsbezirk:'、'Höhe:'、'Fläche:'、'Einwohner:'、'Bevölkerungsdichte:',
“Postleitzahl”、“Vorwahl:”、“Kfz Kennzeichen:”、“Gemeindeschlüssel:”、“Stadtgliedrung:”,
“Adresse”、“Anschrift”、“Webpräsenz:”、“Website:”、“Bürgermester”、“Bürgermesterin”,
“Oberbürgermester”,“Oberbürgermesterin']
writer=csv.DictWriter(csvfile,fieldnames=fieldnames,delimiter=';',quotechar='|',quoting=csv.QUOTE_MINIMAL,extraction='ignore')
writer.writeheader()
对于basisdaten_列表中的i:
通缉犯=我
当前=basisdaten.parent.parent.nextSibling
尽管如此:
如果不是当前的。名称:
current=current.nextSibling
持续
如果在current.text中需要:
items=当前的.findAll('td'))
打印(美化组获取文本(项[0]))
打印(美化组获取文本(项目[1]))
writer.writerow({i:BeautifulSoup.get_text(项[1]))

如果“”。。。只写入一个城市…“:您可以调用
获取每个城市的单个项目数据。然后在此函数中,您可以在语句
中以相同的名称打开输出文件,并将open('statede.csv','w',newline='',encoding='utf-8')作为csvfile:
,它将在每次调用函数时覆盖输出文件


将每个变量写入新行:在语句
writer.writerow({i:BeautifulSoup.get_text(items[1])中
将一个变量的值写入一行。相反,您需要做的是在开始查找页面值之前为值创建一个字典。当您从页面中累积值时,您会按字段名将它们放入字典中。然后,在找到所有可用值后,调用
writer.writerow

“。。。只写入一个城市…“:您可以调用
获取每个城市的单个项目数据。然后在此函数中,您可以在语句
中以相同的名称打开输出文件,并将open('statede.csv','w',newline='',encoding='utf-8')作为csvfile:
,它将在每次调用函数时覆盖输出文件


将每个变量写入新行:在语句
writer.writerow({i:BeautifulSoup.get_text(items[1])中
将一个变量的值写入一行。相反,您需要做的是在开始查找页面值之前为值创建一个字典。当您从页面中累积值时,您会按字段名将它们放入字典中。然后,在找到所有可用值后,调用
writer.writerow

输出有什么问题?我已经做了一个屏幕截图。您可以很容易地用代码测试它,它在Python3.6中工作。输出有什么问题吗?我已经做了一个屏幕截图。您可以很容易地用代码测试它,它在Python 3.6中工作。