LoginSignup
1
2

More than 3 years have passed since last update.

wikipediaから表を抽出する

Last updated at Posted at 2020-03-28
easy_read_html.py
import pandas as pd
url = 'http://www.example.com'
df = pd.read_html(url)

が上手くいかなったので。

初めは上手く行っていた

first.py
import pandas as pd
url = 'https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Italy'
df=pd.read_html(url)

これで表が抽出できたので、pandasすげーと思って、明日やろうとパソコンを閉じました

次の日

ValueError: invalid literal for int() with base 10: '2;'

となり、エラーしかでない。ここでanacondaの再インストールやっても状況が変わらないので、OSの再インストールを実施。
結果は変わらない:cry:

requestsとbeautiful soup

requests_bs.py
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = 'https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Italy'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
data=soup.find_all('table', {"wikitable mw-collapsible"})

最終的にはpandasにお世話になるとして、WEBから情報を得ないと仕方がないので、requestsBeautiful Soupでスクレイピング

データフレームにならない

df = pd.read_html(data)

これで行けるかと思ったら、TypeError: cannot parse from 'ResultSet'

data で確認してみると

[<table class="wikitable mw-collapsible" style="float:left; text-align:right; font-size:83%;">
 <caption style="font-size:116%"><span class="nowrap">Daily COVID-19 cases in Italy by region ...

とリストっぽい

pd.read_html(data[0])

data[0]をみると表のHtmlなので上記コマンドをやってみるとTypeError: 'NoneType' object is not callable
なぜ、こうなるのかわからない:cry:

ググる

'nonetype' object is not callable pandas read_htmlでググるとstackoverflowの結果がでるので、やってみたが、全滅した。リストなのがだめなのか

read_html リスト 抽出

上のキーワードで検索してみてようやく、上手く行く方法をみつけた
https://teratail.com/questions/188717

type(data)

bs4.element.ResultSetなのでそのままread_htmlの引数にならなかった(らしい)

できた

wiki_get.py
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = 'https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Italy'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
data=soup.find_all('table', {"wikitable mw-collapsible"})
df = pd.read_html(str(data), keep_default_na=False)[0]
df=df.iloc[:,0:28]
df.columns=['Date','VDA','LIG','PIE','LOM','VEN','TN','BZ','FVG','EMR','MAR','TOS','UMB','LAZ','ABR','MOL','CAM','BAS','PUG','CAL','SIC','SAR','ConfirmedNew','ConfirmedTotal','DeathsNew','DeathsTotal','ActiveICU','ActiveTotal']
daf=df[df['Date'].str.contains('^2020')]
daf.to_csv('Splunk_COVID19_Italy.csv', index=False)

https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Italy
にある地域別の表を抽出してCSVまで持って行っている。

df = pd.read_html(str(data), keep_default_na=False)[0]

strを使用するとstr型に変換してもらえるので、read_htmlの引数に使える。
戻りがリストなので、最初の結果を抽出すればいい。

df=df.iloc[:,0:28]

列を最初から28行目としている

daf=df[df['Date'].str.contains('^2020')]

必要な列はDate列が2020から始まるもの
DataFrame型は全体ではstr.containsが使えないので、列名を指定している。

daf.to_csv('Splunk_COVID19_Italy.csv', index=False)

CSV出力するときindex番号は不要なので削除

見つけてしまった・・・

https://python-forum.io/Thread-table-from-wikipedia
いつも作った後に・・・:cry:

もっといい奴

https://qiita.com/Retsuki/items/88eded5e61af200305fb
仕事格好いい:smile:

まとめ

SplunkのWebSite Inputが上手くいかず、ググるとpandasの記事
これは簡単/神とやってみたら、いきなりエラーの山でよくわからない
結果的にできましたが、pythonの道は長いです

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2