我有麻烦整理维基表,并希望有人谁曾经这样做可以给我建议。 从List_of_current_heads_of_state_and_government我需要国家(下面的代码作品),然后只有国家元首+他们的名字第一次提到。 我不知道如何在第一次提到隔离,因为他们都进来一个细胞。 而我试图拉他们的名字给了我这个错误: IndexError: list index out of range
。 会感谢你的帮助!
import requests
from bs4 import BeautifulSoup
wiki = "https://en.wikipedia.org/wiki/List_of_current_heads_of_state_and_government"
website_url = requests.get(wiki).text
soup = BeautifulSoup(website_url,'lxml')
my_table = soup.find('table',{'class':'wikitable plainrowheaders'})
#print(my_table)
states = []
titles = []
names = []
for row in my_table.find_all('tr')[1:]:
state_cell = row.find_all('a')[0]
states.append(state_cell.text)
print(states)
for row in my_table.find_all('td'):
title_cell = row.find_all('a')[0]
titles.append(title_cell.text)
print(titles)
for row in my_table.find_all('td'):
name_cell = row.find_all('a')[1]
names.append(name_cell.text)
print(names)
理想的输出将是一个熊猫DF:
State | Title | Name |
如果我能理解你的问题那么下面应该让你有:
import requests
from bs4 import BeautifulSoup
URL = "https://en.wikipedia.org/wiki/List_of_current_heads_of_state_and_government"
res = requests.get(URL).text
soup = BeautifulSoup(res,'lxml')
for items in soup.find('table', class_='wikitable').find_all('tr')[1::1]:
data = items.find_all(['th','td'])
try:
country = data[0].a.text
title = data[1].a.text
name = data[1].a.find_next_sibling().text
except IndexError:pass
print("{}|{}|{}".format(country,title,name))
输出:
Afghanistan|President|Ashraf Ghani
Albania|President|Ilir Meta
Algeria|President|Abdelaziz Bouteflika
Andorra|Episcopal Co-Prince|Joan Enric Vives Sicília
Angola|President|João Lourenço
Antigua and Barbuda|Queen|Elizabeth II
Argentina|President|Mauricio Macri
等等 - -
我明白这是但是如果别人一直在寻找做同样的事情,一个古老的线程,我发现了一个超级简单的和短期的方式做到这一点,通过导入wikipedia
Python模块,然后用大熊猫read_html
把它变成一个数据帧。 从那里,你可以申请你想分析的任何量。
这里是我的代码 - 这是从从命令行调用:
通过简单地调用python yourfile.py -p Wikipedia_Page_Article_Here
import pandas as pd
import argparse
import wikipedia as wp
parser = argparse.ArgumentParser()
parser.add_argument("-p", "--wiki_page", help="Give a wiki page to get table", required=True)
args = parser.parse_args()
html = wp.page(args.wiki_page).html().encode("UTF-8")
try:
df = pd.read_html(html)[1] # Try 2nd table first as most pages contain contents table first
except IndexError:
df = pd.read_html(html)[0]
print(df.to_string())
希望这有助于有人出来!
或不带命令行参数:
import pandas as pd
import wikipedia as wp
html = wp.page("List_of_video_games_considered_the_best").html().encode("UTF-8")
try:
df = pd.read_html(html)[1] # Try 2nd table first as most pages contain contents table first
except IndexError:
df = pd.read_html(html)[0]
print(df.to_string())
它并不完美,但它几乎是这样工作的。
import requests
from bs4 import BeautifulSoup
wiki = "https://en.wikipedia.org/wiki/List_of_current_heads_of_state_and_government"
website_url = requests.get(wiki).text
soup = BeautifulSoup(website_url,'lxml')
my_table = soup.find('table',{'class':'wikitable plainrowheaders'})
#print(my_table)
states = []
titles = []
names = []
""" for row in my_table.find_all('tr')[1:]:
state_cell = row.find_all('a')[0]
states.append(state_cell.text)
print(states)
for row in my_table.find_all('td'):
title_cell = row.find_all('a')[0]
titles.append(title_cell.text)
print(titles) """
for row in my_table.find_all('td'):
try:
names.append(row.find_all('a')[1].text)
except IndexError:
names.append(row.find_all('a')[0].text)
print(names)
有这名列表只是一个错误到目前为止,我可以看到。 该表是有点困难,因为你必须写例外。 比如有名字,他们是不是一个链接,然后将代码捕获刚刚发现该行中的第一个环节。 但你只需要多写一些,如果子句这样的情况。 至少我会愿意这样做。