如何从Python中的网站中提取表格

时间:2012-05-11 17:33:41

标签: python urllib

在这里,

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

我从这里输了。谁可以提供帮助呢?谢谢!

6 个答案:

答案 0 :(得分:25)

Pandas可以直接执行此操作,从而使您不必自己解析HTML。 to_html()从您的html中提取所有表格,并将其放入dataframes列表中。 to_csv()可用于将每个数据帧转换为csv文件。对于您示例中的网页,相关表格是最后一个,这就是我在下面的代码中使用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>)

答案 1 :(得分:10)

所以基本上你想要解析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:]]

答案 2 :(得分:2)

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

答案 3 :(得分:0)

您需要将表解析为内部数据结构,然后以CSV格式输出。

使用BeautifulSoup来解析表格。 This question是关于如何做到的(接受的答案使用版本3.0.8,它现在已经过时,但您仍然可以使用它,或转换说明以使用BeautifulSoup版本4)。

在数据结构中有表格(在这种情况下可能是列表列表),您可以使用csv.write将其写出来。

答案 4 :(得分:0)

查看BeautifulSOup模块。在documentation中,您将找到许多解析html的示例。

同样对于csv,您已准备好解决方案 - csv module

应该很容易。

答案 5 :(得分:0)

看看这个答案parsing table with BeautifulSoup and write in text file。 也可以使用谷歌与下一个单词“python beautifulsoup”