Python解析JavaScript生成的HTML表格

Posted

技术标签:

【中文标题】Python解析JavaScript生成的HTML表格【英文标题】:Python Parsing HTML Table Generated by JavaScript 【发布时间】:2014-09-23 14:27:49 【问题描述】:

我正在尝试将 NYSE 网站 (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生成的。在我的 Web 浏览器中使用开发人员工具时,我看到该表格看起来像任何其他带有标签等的 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 解析器去查找 table 标记时,它只能找到 if 条件,并且下面没有适当的标记可以指示内容。我怎样才能刮掉这张桌子?是否有我可以搜索的标签而不是可以显示内容的表格?由于代码不是传统的html表格形式,如何用pandas读入--是否必须手动解析数据?

【问题讨论】:

我不认为你可以用 BS。也许尝试硒? ***.com/questions/8960288/… 你用过splinter吗? ***.com/questions/8143023/… 可能会有所帮助。 【参考方案1】:

在这种情况下,您需要一些东西来为您运行该 javascript 代码。

这里的一个选项是使用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 可以通过查看网页获取。

以上是关于Python解析JavaScript生成的HTML表格的主要内容,如果未能解决你的问题,请参考以下文章

用于呈现 HTML 和 javascript 的 Python 库 [关闭]

Python中的JavaScript解析器[关闭]

Python生成器, 列表解析与字典解析

用python抓取javascript生成的html

Python - 列表解析式/生成器表达式

python之列表解析与生成器