Python 为我提供了一张表格的两列,但我只希望它给我其中一列

问题描述

我正在使用 Python 从 Ballotpedia (https://ballotpedia.org/Alaska_Supreme_Court) 中抓取阿拉斯加最高法院法官的姓名。我当前的代码在“任命者”列中同时提供了法官的姓名以及人员的姓名。这是我当前的代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

list = ['https://ballotpedia.org/Alaska_Supreme_Court']

temp_dict = {}

for page in list:
    r = requests.get(page)
    soup = BeautifulSoup(r.content,'html.parser')

    temp_dict[page.split('/')[-1]] = [item.text for item in soup.select("table.wikitable.sortable.jquery-tablesorter a")]

df = pd.DataFrame.from_dict(temp_dict,orient='index').transpose()
df.to_csv('18-TEST.csv')

我一直在尝试使用这条线:

temp_dict[page.split('/')[-1]] = [item.text for item in soup.select("table.wikitable.sortable.jquery-tablesorter a")]

我在网页上使用检查功能有点缺乏经验,所以当我尝试将“tr”或“td”(我在“tbody”下找到)放在“tablesorter”之后时,我可能会尝试错误的东西.在这一点上我有点迷茫,并且在寻找这方面的资源时遇到了麻烦。你能帮我让python给我法官列而不是任命列吗?谢谢!

解决方法

有不同的方法可以得到结果。

选项#1

对列表进行切片并每隔一个元素选取一个:

soup.select("table.wikitable.sortable.jquery-tablesorter a")][0::2]

示例:

import requests
from bs4 import BeautifulSoup
import pandas as pd

lst = ['https://ballotpedia.org/Alaska_Supreme_Court']

temp_dict = {}

for page in lst:
    r = requests.get(page)
    soup = BeautifulSoup(r.content,'html.parser')

    temp_dict[page.split('/')[-1]] = [item.text for item in soup.select("table.wikitable.sortable.jquery-tablesorter a")][0::2]

pd.DataFrame.from_dict(temp_dict,orient='index').transpose().to_csv('18-TEST.csv',index=False)

选项#2

使您的选择更加具体,并仅选择 td 中的第一个 tr

soup.select("table.wikitable.sortable.jquery-tablesorter  tr > td:nth-of-type(1)")]

示例

import requests
from bs4 import BeautifulSoup
import pandas as pd

list = ['https://ballotpedia.org/Alaska_Supreme_Court']

temp_dict = {}

for page in list:
    r = requests.get(page)
    soup = BeautifulSoup(r.content,'html.parser')

    temp_dict[page.split('/')[-1]] = [item.text for item in soup.select("table.wikitable.sortable.jquery-tablesorter  tr > td:nth-of-type(1)")]

pd.DataFrame.from_dict(temp_dict,index=False)

选项#3

使用 pandas 功能 read_html()

示例

import pandas as pd
df = pd.read_html('https://ballotpedia.org/Alaska_Supreme_Court')[2]
df.Judge.to_csv('18-TEST.csv',index=False)
,

首先,请注意这是从 here 中提取的代码。

现在,如果您不知道有多少行或列,这将为您提供一个包含所有列的数据框,对应于网页上的表格。如果您不需要,请随意删除其中一列。

import requests
from bs4 import BeautifulSoup
import pandas as pd

# I'll do it for the one page example
page = 'https://ballotpedia.org/Alaska_Supreme_Court'

temp_dict = {}
r = requests.get(page)
soup = BeautifulSoup(r.content,'html.parser')

# this finds the first table with the class specified
table = soup.find('table',attrs={'class':'wikitable sortable jquery-tablesorter'})
# get all rows of the above table
rows = table.find_all('tr') 
data = []
for row in rows:
    cols = row.find_all('td')
    cols = [ele.text.strip() for ele in cols]
    data.append([ele for ele in cols if ele])
# turn it into a pandas dataframe
df = pd.DataFrame(data)
,

我想分享另一种方法,让您以所需格式制作表格:

import pandas as pd
# extracting table and making it dataframe
frame = pd.read_html('https://ballotpedia.org/Alaska_Supreme_Court',attrs={"class":"wikitable sortable jquery-tablesorter"})[0]

# drop unwanted columns
frame.drop("Appointed By",axis=1,inplace=True)

# save dataframe as csv
frame.to_csv("desired/path/output.csv",index=False)

打印 frame 将输出为: |法官| |-----| |丹尼尔温弗里 |乔尔·哈罗德·博尔格| |彼得·乔恩·马森| |苏珊·卡尼| |达里奥·博尔赫桑|

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...