在这里,
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()
我从这里输了。谁可以提供帮助呢?谢谢!
答案 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
文件以获取元素。您可以使用BeautifulSoup或lxml执行此任务。
您已使用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链接。
您可以按如下方式使用它:
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)
答案 5 :(得分:0)
看看这个答案parsing table with BeautifulSoup and write in text file。 也可以使用谷歌与下一个单词“python beautifulsoup”