维基百科刮表格与Python选择性(Scraping Wikipedia tables with P

2019-09-28 13:04发布

我有麻烦整理维基表,并希望有人谁曾经这样做可以给我建议。 从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 |

Answer 1:

如果我能理解你的问题那么下面应该让你有:

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

等等 - -



Answer 2:

我明白这是但是如果别人一直在寻找做同样的事情,一个古老的线程,我发现了一个超级简单的和短期的方式做到这一点,通过导入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())


Answer 3:

它并不完美,但它几乎是这样工作的。

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)

有这名列表只是一个错误到目前为止,我可以看到。 该表是有点困难,因为你必须写例外。 比如有名字,他们是不是一个链接,然后将代码捕获刚刚发现该行中的第一个环节。 但你只需要多写一些,如果子句这样的情况。 至少我会愿意这样做。



文章来源: Scraping Wikipedia tables with Python selectively