web-dev-qa-db-ja.com

HTMLテーブルをCSVにスクレイピングするにはどうすればよいですか?

問題

仕事でクエリを実行し、情報のHTMLテーブルを取得できるツールを使用しています。私はそれに対するいかなる種類のバックエンドアクセスも持っていません。

この情報の多くは、並べ替え、平均化などのためにスプレッドシートに入れることができれば、はるかに役立ちます。このデータをCSVファイルにスクリーンスクレイプするにはどうすればよいですか

私の最初のアイデア

JQueryを知っているので、画面上の表の書式設定を取り除き、カンマと改行を挿入し、混乱全体をメモ帳にコピーしてCSVとして保存するために使用できると思いました。 より良いアイデア?

ソリューション

はい、皆さん、コピーと貼り付けと同じくらい簡単でした。私は愚かな気分にしないでください。

具体的には、スプレッドシートに貼り付けたときに、「特殊貼り付け」を選択し、「テキスト」形式を選択する必要がありました。それ以外の場合は、スプレッドシート全体を強調表示しても、すべてを1つのセルに貼り付けようとしました。

40
Nathan Long
  • ツールのUIでHTMLテーブルを選択し、クリップボードにコピーします(可能な場合)
  • Excelに貼り付けます。
  • CSVファイルとして保存

ただし、これは自動化されたソリューションではなく手動のソリューションです。

33
mkoeller

pythonを使用:

たとえば、次のようなサイトからcsv形式の外国為替相場をスクレイピングしたいと想像してください: fxquotes

その後...

from BeautifulSoup import BeautifulSoup
import urllib,string,csv,sys,os
from string import replace

date_s = '&date1=01/01/08'
date_f = '&date=11/10/08'
fx_url = 'http://www.oanda.com/convert/fxhistory?date_fmt=us'
fx_url_end = '&lang=en&margin_fixed=0&format=CSV&redirected=1'
cur1,cur2 = 'USD','AUD'
fx_url = fx_url + date_f + date_s + '&exch=' + cur1 +'&exch2=' + cur1
fx_url = fx_url +'&expr=' + cur2 +  '&expr2=' + cur2 + fx_url_end
data = urllib.urlopen(fx_url).read()
soup = BeautifulSoup(data)
data = str(soup.findAll('pre', limit=1))
data = replace(data,'[<pre>','')
data = replace(data,'</pre>]','')
file_location = '/Users/location_edit_this'
file_name = file_location + 'usd_aus.csv'
file = open(file_name,"w")
file.write(data)
file.close()

編集:テーブルから値を取得するには:例: palewire

from mechanize import Browser
from BeautifulSoup import BeautifulSoup

mech = Browser()

url = "http://www.palewire.com/scrape/albums/2007.html"
page = mech.open(url)

html = page.read()
soup = BeautifulSoup(html)

table = soup.find("table", border=1)

for row in table.findAll('tr')[1:]:
    col = row.findAll('td')

    rank = col[0].string
    artist = col[1].string
    album = col[2].string
    cover_link = col[3].img['src']

    record = (rank, artist, album, cover_link)
    print "|".join(record)
12
Thorvaldur

これは、my pythonを使用して取得できる(現在)BeautifulSoupの最新バージョンを使用しているバージョンです。たとえば、

$ Sudo easy_install beautifulsoup4

このスクリプトは、標準入力からHTMLを読み取り、すべてのテーブルで見つかったテキストを適切なCSV形式で出力します。

#!/usr/bin/python
from bs4 import BeautifulSoup
import sys
import re
import csv

def cell_text(cell):
    return " ".join(cell.stripped_strings)

soup = BeautifulSoup(sys.stdin.read())
output = csv.writer(sys.stdout)

for table in soup.find_all('table'):
    for row in table.find_all('tr'):
        col = map(cell_text, row.find_all(re.compile('t[dh]')))
        output.writerow(col)
    output.writerow([])
10
Juan A. Navarro

さらに簡単(次回のために保存されるため)...

Excelで

データ/外部データのインポート/新しいWebクエリ

uRLプロンプトが表示されます。 URLを入力すると、ページ上のインポート可能なテーブルが区切られます。出来上がり。

5
dkretz

早くて汚い:

ブラウザからExcelにコピーし、CSVとして保存します。

より良いソリューション(長期使用の場合):

選択した言語でHTMLコンテンツをプルダウンし、必要なビットを削り取るコードを少し書いてください。おそらく、データの取得に加えて、すべてのデータ操作(ソート、平均化など)を投入できます。そうすれば、コードを実行するだけで、必要な実際のレポートを取得できます。

それはすべて、この特定のタスクを実行する頻度に依存します。

2
James Van Huis

Basic Python BeautifulSoupを使用した実装。rowspanとcolspanの両方も考慮します。

from BeautifulSoup import BeautifulSoup

def table2csv(html_txt):
   csvs = []
   soup = BeautifulSoup(html_txt)
   tables = soup.findAll('table')

   for table in tables:
       csv = ''
       rows = table.findAll('tr')
       row_spans = []
       do_ident = False

       for tr in rows:
           cols = tr.findAll(['th','td'])

           for cell in cols:
               colspan = int(cell.get('colspan',1))
               rowspan = int(cell.get('rowspan',1))

               if do_ident:
                   do_ident = False
                   csv += ','*(len(row_spans))

               if rowspan > 1: row_spans.append(rowspan)

               csv += '"{text}"'.format(text=cell.text) + ','*(colspan)

           if row_spans:
               for i in xrange(len(row_spans)-1,-1,-1):
                   row_spans[i] -= 1
                   if row_spans[i] < 1: row_spans.pop()

           do_ident = True if row_spans else False

           csv += '\n'

       csvs.append(csv)
       #print csv

   return '\n\n'.join(csvs)
2
Aviad

Excelはhttpページを開くことができます。

例えば:

  1. ファイルをクリックして開く

  2. ファイル名の下にURLを貼り付けます。つまり、 HTMLテーブルをCSVにスクレイプするにはどうすればよいですか?

  3. OKをクリック

Excelは、htmlをテーブルに変換するために最善を尽くします。

最もエレガントなソリューションではありませんが、機能します!

2
Christian Payne

以下は、grequestとsoupを組み合わせて、構造化されたWebサイトから大量のページをダウンロードするテスト済みの例です。

#!/usr/bin/python

from bs4 import BeautifulSoup
import sys
import re
import csv
import grequests
import time

def cell_text(cell):
    return " ".join(cell.stripped_strings)

def parse_table(body_html):
    soup = BeautifulSoup(body_html)
    for table in soup.find_all('table'):
        for row in table.find_all('tr'):
            col = map(cell_text, row.find_all(re.compile('t[dh]')))
            print(col)

def process_a_page(response, *args, **kwargs): 
    parse_table(response.content)

def download_a_chunk(k):
    chunk_size = 10 #number of html pages
    x = "http://www.blahblah....com/inclusiones.php?p="
    x2 = "&name=..."
    URLS = [x+str(i)+x2 for i in range(k*chunk_size, k*(chunk_size+1)) ]
    reqs = [grequests.get(url, hooks={'response': process_a_page}) for url in URLS]
    resp = grequests.map(reqs, size=10)

# download slowly so the server does not block you
for k in range(0,500):
    print("downloading chunk ",str(k))
    download_a_chunk(k)
    time.sleep(11)
1
user1205101

Excelで開いてみましたか? Excelでスプレッドシートをhtmlとして保存すると、Excelが使用する形式が表示されます。私が書いたWebアプリから、ユーザーがExcelにエクスポートできるように、このhtml形式を吐き出しました。

0
Will Rickards

スクリーンスクレイピングを行っており、変換しようとしているテーブルに特定のIDがある場合、HTMLの正規表現解析と、スクリプトを作成してCSVを生成することができます。

0
andy