用不同的姓氏数刮取姓名列表

2024-09-27 21:27:23 发布

您现在位置:Python中文网/ 问答频道 /正文

试图用漂亮的汤来讨好瑞典议员。当我运行scraper时,我得到“ValueError:太多的值需要解包(预期为3)”。你知道吗

脚本输出一个csv,但只有五个名称。名单上的第六个人叫阿尔姆·埃里克森,简妮(议员)。我想问题是她有两个姓——Alm Ericson,代码只需要三个值:firstname、lastname和party。你知道吗

我应该如何对字段分割进行编码,使其也适用于双姓?你知道吗

这一页上的名字写为

Last_name, first_name (party)

代码:

import urllib.request
import bs4 as bs
import csv

source = urllib.request.urlopen("https://www.riksdagen.se/sv/ledamoter-partier/").read()
soup = bs.BeautifulSoup(source, "lxml")

data = []

for span in soup.find_all("span", {"class": "fellow-name"}):
    cleanednames = span.text.strip()
    data.append(cleanednames)  #fields are appended to list rather printing

with open("riksdagsledamoter.csv", "w") as stream:
    fieldnames = ["Last_Name","First_Name","Party"]
    var = csv.DictWriter(stream, fieldnames=fieldnames)
    var.writeheader()
    for item in data:
        last_name, First_name, party = item.split()  #splitting data in 3 fields
        last_name = last_name.replace(",","")  #removing ',' from last name
        party = party.replace("(","").replace(")","")  #removing "()" from party
        var.writerow({"Last_Name": last_name,"First_Name": First_name, "Party": party})  #writing to csv row

Tags: csvnameinimportdatavarpartyreplace
3条回答

下面是一个简单的正则表达式,应该可以做到这一点

 import re
 print(re.match("(.*), (.*) \((.*)\)", 'Alm Ericson, Janine (MP)').groups())

灵感来自科伦丁的回答

显然,分裂不是一个好的解决办法。(或者用逗号和圆括号而不是空格分隔)

使用regexp:

import re
re.match('([^,]*), ([^(]*) \((.*)\)', 'Alm Ericson, Janine (MP)').groups()

退货

('Alm Ericson', 'Janine', 'MP')

我猜你也可以使用函数返回列表中的部分(不像已经给出的答案那么干净)

def getParts(inputString):
    list1 = inputString.split(",")
    list2 = list1[1].split("(")
    finalList = [list1[0], list2[0].strip(),list2[1].replace(")","")]
    return finalList

inputString = 'Alm Ericson, Janine (MP)'

print(getParts(s))

相关问题 更多 >

    热门问题