使用Python解析由JavaScript生成的HTML表格

11

我想从纽约证券交易所网站(http://www1.nyse.com/about/listed/IPO_Index.html)中爬取一个表格并将其转换为Pandas数据框架。为此,我有如下设置:

def htmltodf(url):
page = requests.get(url)
soup = BeautifulSoup(page.text)

tables = soup.findAll('table')
test = pandas.io.html.read_html(str(tables))

return(test)            #return dataframe type object

然而,当我在页面上运行时,列表中返回的所有表格都基本为空。进一步调查后,我发现该表格是由JavaScript生成的。使用网页浏览器的开发者工具时,我看到该表格看起来像任何其他带有标签等HTML表格。然而,在查看源代码时,出现了类似这样的内容:
<script language="JavaScript">

.
.
.

<script>
var year = [["ICC","21st Century Oncology Holdings, Inc.","22 May  2014","/about/listed/icc.html" ],
... more entries here ...
,["ZOES","Zoe's Kitchen, Inc.","11 Apr 2014","/about/listed/zoes.html" ]] ;

    if(year.length != 0) 
    {   

    document.write ("<table width='619' border='0' cellspacing='0' cellpadding='0'><tr><td><span class='fontbold'>");
    document.write ('2014' + " IPO Showcase"); 
    document.write ("</span></td></tr></table>"); 
    }  
</script>

因此,当我的HTML解析器寻找表格标签时,它只能找到if条件,并没有适当的标签来指示内容。我该如何爬取这个表格?有没有一个标签可以替代表格来显示内容?因为代码不是以传统的HTML表格形式呈现的,所以我该如何使用pandas读取数据--我需要手动解析数据吗?

我认为你不能使用BS。也许可以尝试Selenium?https://dev59.com/2mox5IYBdhLWcg3wzXal - fredtantini
你使用了splinter吗? - WannaBeCoder
也许这个可以帮到你:使用Selenium和Python保存表格。 - WannaBeCoder
1个回答

8
在这种情况下,你需要有一个东西来运行那段javascript代码。其中一种选择是使用selenium: selenium
from pandas.io.html import read_html
from selenium import webdriver


driver = webdriver.Firefox()
driver.get('http://www1.nyse.com/about/listed/IPO_Index.html')

table = driver.find_element_by_xpath('//div[@class="sp5"]/table//table/..')
table_html = table.get_attribute('innerHTML')

df = read_html(table_html)[0]
print df

driver.close()

打印:

                                                    0        1          2   3
0                                                Name   Symbol        NaT NaN
1                       Performance Sports Group Ltd.      PSG 2014-06-20 NaN
2                           Century Communities, Inc.      CCS 2014-06-18 NaN
3                        Foresight Energy Partners LP     FELP 2014-06-18 NaN
...
79  EGShares TCW EM Long Term Investment Grade Bon...     LEMF 2014-01-08 NaN
80  EGShares TCW EM Short Term Investment Grade Bo...     SEMF 2014-01-08 NaN

[81 rows x 4 columns]

你如何找到 driver.find_element_by_xpath() 的输入?我正在尝试爬取雅虎幻想体育。 - riders994
@riders994 你可以通过检查网页来获取它。 - Dd H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接