如何用Python从网站中提取表

2024-05-16 09:06:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在这里

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()

我从这里输了。有谁能帮忙吗?谢谢!


Tags: importreportwebhttpwwwurllibyearmsa
3条回答

所以本质上你需要解析出html文件来从中获取元素。您可以使用BeautifulSouplxml执行此任务。

您已经有了使用BeautifulSoup的解决方案。我将使用lxml发布解决方案:

from lxml import etree
import urllib

web = urllib.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:]]

我建议美化组,因为它有最多的功能。我修改了一个我在网上找到的可以从网页中提取所有表的表解析器,只要没有嵌套表。有些代码是针对我试图解决的问题而编写的,但是根据您的使用情况修改应该很容易。这是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链接的表解析器,您应该能够到达您想要去的地方。

Pandas可以在开箱即用的情况下做到这一点,省得您自己解析html。^{}从html中提取所有表,并将它们放入dataframes列表中。^{}可用于将每个数据帧转换为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')

如果你愿意的话,一行就足够简单了:

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

相关问题 更多 >