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 文件。对于您示例中的网页,相关表是最后一个,这就是我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>)

PS只要确保您已经提前安装了lxmlhtml5lib和软件包。BeautifulSoup4

于 2017-06-12T18:36:46.797 回答
17

所以本质上你想解析html文件以从中获取元素。您可以使用BeautifulSouplxml来完成此任务。

您已经有了使用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,因为它具有最多的功能。我修改了一个我在网上找到的表格解析器,它可以从网页中提取所有表格,只要没有嵌套表格。一些代码特定于我试图解决的问题,但它应该很容易修改以供您使用。这是过去的bin链接。

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查看这个答案解析表并写入文本文件。也使用谷歌与下一个词“python beautifulsoup”

于 2012-05-11T17:42:59.333 回答