17

ここ、

http://www.ffiec.gov/census/report.aspx?year=2011&state=01&report=demographic&msa=11500

机がある。私の目標は、テーブルを抽出してcsvファイルに保存することです。私はコードを書きました:

import urllib
import os

web = urllib.urlopen("http://www.ffiec.gov/census/report.aspx?year=2011&state=01&report=demographic&msa=11500")

s = web.read()
web.close()

ff = open(r"D:\ex\python_ex\urllib\output.txt", "w")
ff.write(s)
ff.close()

ここから負けました。これを手伝ってくれる人はいますか?ありがとう!

4

6 に答える 6

80

Pandasはこれを箱から出してすぐに実行できるため、HTMLを自分で解析する必要がなくなります。to_html()HTMLからすべてのテーブルを抽出し、それらをデータフレームのリストに配置します。 to_csv()各データフレームをcsvファイルに変換するために使用できます。あなたの例のWebページの場合、関連するテーブルが最後のテーブルであるため、df_list[-1]以下のコードで使用しました。

import requests
import pandas as pd

url = 'http://www.ffiec.gov/census/report.aspx?year=2011&state=01&report=demographic&msa=11500'
html = requests.get(url).content
df_list = pd.read_html(html)
df = df_list[-1]
print(df)
df.to_csv('my data.csv')

必要に応じて、1行で実行するのは簡単です。

pd.read_html(requests.get(<url>).content)[-1].to_csv(<csv file>)

PSlxml、、、html5libおよびBeautifulSoup4パッケージが事前にインストールされていることを確認してください。

于 2017-06-12T18:36:46.797 に答える
17

したがって、基本的には、htmlファイルを解析して要素を取得する必要があります。このタスクにはBeautifulSoupまたはlxmlを使用できます。

を使用したソリューションはすでにありますBeautifulSoup。を使用して解決策を投稿しますlxml

from lxml import etree
import urllib.request

web = urllib.request.urlopen("http://www.ffiec.gov/census/report.aspx?year=2011&state=01&report=demographic&msa=11500")
s = web.read()

html = etree.HTML(s)

## Get all 'tr'
tr_nodes = html.xpath('//table[@id="Report1_dgReportDemographic"]/tr')

## 'th' is inside first 'tr'
header = [i[0].text for i in tr_nodes[0].xpath("th")]

## Get text from rest all 'tr'
td_content = [[td.text for td in tr.xpath('td')] for tr in tr_nodes[1:]]
于 2012-05-11T17:41:49.247 に答える
3

最も機能性の高いBeautifulSoupをお勧めします。ネストされたテーブルがない限り、Webページからすべてのテーブルを抽出できるオンラインで見つけたテーブルパーサーを変更しました。一部のコードは、私が解決しようとしていた問題に固有のものですが、使用法に合わせて変更するのは非常に簡単です。これがpastbinのリンクです。

http://pastebin.com/RPNbtX8Q

次のように使用できます。

from urllib2 import Request, urlopen, URLError
from TableParser import TableParser
url_addr ='http://foo/bar'
req = Request(url_addr)
url = urlopen(req)
tp = TableParser()
tp.feed(url.read())

# NOTE: Here you need to know exactly how many tables are on the page and which one
# you want. Let's say it's the first table
my_table = tp.get_tables()[0]
filename = 'table_as_csv.csv'
f = open(filename, 'wb')
with f:
    writer = csv.writer(f)
    for row in table:
        writer.writerow(row)

上記のコードはアウトラインですが、pastbinリンクからテーブルパーサーを使用すると、目的の場所に到達できるはずです。

于 2012-05-11T18:56:29.720 に答える
1

テーブルを内部データ構造に解析してから、CSV形式で出力する必要があります。

BeautifulSoupテーブルを解析するために 使用します。この質問はそれを行う方法についてです(受け入れられた回答は、現在では古くなっているバージョン3.0.8を使用していますが、それでも使用するか、BeautifulSoupバージョン4で動作するように手順を変換できます)。

データ構造(この場合はおそらくリストのリスト)にテーブルを作成したら、csv.writeを使用してテーブルを書き出すことができます。

于 2012-05-11T17:42:15.440 に答える
1

BeautifulSOupモジュールを見てください。ドキュメントには、htmlの解析の多くの例があります。

また、csvの場合、解決策が用意されています-csvモジュール

とても簡単なはずです。

于 2012-05-11T17:42:41.457 に答える
1

この回答解析テーブルをBeautifulSoupで見て、テキストファイルに書き込みます。また、次の単語「pythonbeautifulsoup」でグーグルを使用してください

于 2012-05-11T17:42:59.333 に答える