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

Bil*_* TP 6 python urllib

这里,

http://www.ffiec.gov/census/report.aspx?year=2011&state=01&report=demographic&msa=11500
Run Code Online (Sandbox Code Playgroud)

这里有张桌子.我的目标是提取表并将其保存到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()
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ese 33

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')
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以在一行中做到这一点很简单:

pd.read_html(requests.get(<url>).content)[-1].to_csv(<csv file>)
Run Code Online (Sandbox Code Playgroud)

  • 互联网上最好的解决方案之一.干杯男. (3认同)
  • 优秀的解决方案!提醒其他人,熊猫需要其他依赖项才能完成此任务:beautifulsoup4,html5lib和lxml (2认同)
  • @Foad如果您查看该页面的源文件,您会发现您所在的表是动态加载的,这就是“requests.get(url).content”中缺少它的原因。您需要首先研究支持运行脚本的网络抓取方法。或者,您可以预先将网页保存到文件中,然后执行“pd.read_html(&lt;文件路径&gt;)”。 (2认同)

Vik*_*kas 11

所以基本上你想要解析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:]]
Run Code Online (Sandbox Code Playgroud)