【问题标题】:How to extract tables from websites in Python如何在 Python 中从网站中提取表格
【发布时间】:2012-05-11 17:33:41
【问题描述】:

这里,

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

我从这里迷路了。任何人都可以在这方面提供帮助?谢谢!

【问题讨论】:

    标签: python urllib


    【解决方案1】:

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

    P.S.请确保您提前安装了 lxmlhtml5libBeautifulSoup4 软件包。

    【讨论】:

    • 互联网上最好的解决方案之一。干杯人。
    • 优秀的解决方案!请注意,pandas 需要额外的依赖项才能完成此操作:beautifulsoup4、html5lib 和 lxml
    • 缺少括号!!修改为打印(df)
    • 我在this website 上尝试了您的代码sn-p,但我收到ValueError: No tables found 错误。知道应该如何解决吗?
    • @Foad 如果您查看该页面的源文件,您会看到您所追求的表格是动态加载的,这就是requests.get(url).content 中缺少它的原因。您将需要首先研究支持运行脚本的网络抓取方法。或者,您可以事先将网页保存到文件中,然后执行pd.read_html(&lt;file path&gt;)
    【解决方案2】:

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

    【讨论】:

    • 我正在尝试按照您的代码从this website 中提取表格,但在tr_nodes = html.xpath('//table[@id="DataTables_Table_0"]/tr') 行(这是基于网页内容的修改),我得到空tr_nodes,知道可能是什么问题吗?
    【解决方案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 链接的表格解析器,你应该能够到达你想去的地方。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        查看BeautifulSOup 模块。在documentation你会发现很多解析html的例子。

        对于 csv,您也有现成的解决方案 - csv module

        应该很简单。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-06
            • 1970-01-01
            相关资源
            最近更新 更多