Python 2.7 Python-webscraping;字典数据结构

Python 2.7 Python-webscraping;字典数据结构,python-2.7,dictionary,web-scraping,beautifulsoup,key-value,Python 2.7,Dictionary,Web Scraping,Beautifulsoup,Key Value,我需要清理这个网站()并生成一个Excel文件,该文件在第1列中有标题“文件柜名称”,在第2列中有标题“Era”。这意味着每个内阁名称(如Kabinet Presidensil、Kabinet Sjahrir I)都应该有自己的一行,以及各自的时代(如Revolusi Fisik时代、印度尼西亚共和国时代) 这是我得到的最接近的结果: import requests from bs4 import BeautifulSoup response = requests.get('http://se

我需要清理这个网站()并生成一个Excel文件,该文件在第1列中有标题“文件柜名称”,在第2列中有标题“Era”。这意味着每个内阁名称(如Kabinet Presidensil、Kabinet Sjahrir I)都应该有自己的一行,以及各自的时代(如Revolusi Fisik时代、印度尼西亚共和国时代)

这是我得到的最接近的结果:

import requests
from bs4 import BeautifulSoup

response = requests.get('http://setkab.go.id/profil-kabinet/#')
soup = BeautifulSoup(response.text, 'html.parser')

eras = soup.find_all('div', attrs={'class':"wpb_accordion_section group"})

setkab = {}
for element in eras: 
    setkab[element.a.get_text()] = {}

for element in eras:
    cabname = element.find('div',attrs={'class':'wpb_wrapper'}).get_text()
    setkab[element.a.get_text()]['cbnm'] = cabname

for item in setkab.keys():
    print item + setkab[item]['cbnm']

import os, csv
os.chdir("/Users/mxcodes/Code")

with open("setkabfinal.csv", "w") as toWrite:
    writer = csv.writer(toWrite, delimiter=",")
    writer.writerow(["Era", "Cabinet name"])
    for a in setkab.keys():
        writer.writerow([a.encode("utf-8"), setkab[a]["cbnm"]])
但是,这将创建一个Excel文件,在第1列和第2列中分别显示标题“Era”和“CAB NAME”。它无法将每个文件柜名称放在单独的一行中。例如,在第1列中有“Era Revolusi Fisik”,并在第2列中列出所有机柜


我的猜测是,我需要以某种方式切换键值对,以便每个文件柜都成为一个键,它的时代成为它的价值——因为目前情况正好相反。但我试过了,但没有成功。有什么帮助吗?谢谢大家!

据我所见,您用于编写的
Cabines[a][“cbnm”]
变量只是一个长
Unicode
,因此当您执行
writer.writerow([a.encode(“utf-8”),Cabines[a][“cbnm”])
时,实际发生的情况是您在第一列写入era,在下一列的单个单元格中写入整个Unicode(即使字符串中有
\n
,也不会阻止将其写入单个单元格(
csv
实际上认为您希望unicode仅位于一个单元格中,因此它会将
放在
文件柜[a][“cbnm”]
值之前和之后,以确保它实际位于一个单元格中)),要在另一行中写入每个CAB值,应分别为每个所需行使用
writerow
方法。 例如,这段代码对我来说很好:

cabinets = setkab 
with open("cabinets.csv", "w") as toWrite:
    writer = csv.writer(toWrite, delimiter=",")
    writer.writerow(["Era", "Cabinet name"])
    for a in setkab.keys():
        writer.writerow([a.encode("utf-8")])  #write the era column
        cabinets_list = [i for i in cabinets[a]["cbnm"].split('\n') if i != '']  #get all the values that are separated by newline chars (if they aren't empty strings)
        for i in cabinets_list: writer.writerow([a.encode("utf-8"),i])   #write every value separately in the CABINET NAME row
如你所见,我只更改了最后3行


我希望这会对您有所帮助!

谢谢您的帮助!该代码确实会在单独的行中给出机柜名称-这是我想要的。但它不会在相邻的列中给出每个机柜的Era类型-这也是我需要的。换句话说,“Era”列应该有单独的行,但重复Era类型;“CAB name”column应该有单独的行,但有唯一的文件柜名称。目前“Era”列只有6个唯一的行。对此有什么建议吗?@mxcodes当然,我已经更新了代码(基本上-而不是执行
writer.writerow(['',I])
(在文件柜列旁边创建一个空列),我们将执行此操作
writer.writerow([a.encode([utf-8])),i])