通过 BS4 将 Scraped Table 加载到 Pandas Dataframe 中

Posted

技术标签:

【中文标题】通过 BS4 将 Scraped Table 加载到 Pandas Dataframe 中【英文标题】:Load Scraped Table via BS4 into Pandas Dataframe 【发布时间】:2017-04-27 07:05:08 【问题描述】:

我正在尝试从here 获取任何 Basic Box Score Stat 或 Advanced Box Score Stats 表

我试着做这样的事情:

url = "http://www.basketball-reference.com/boxscores/200112100LAC.html"
page = requests.get(url, headers='User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36')
soup = BeautifulSoup(page.content, "html5lib")

table =  soup.find('div', class_='overthrow table_container').find('table',class_='sortable stats_table')
df = pd.read_html(table)
print df

但是由于 NoneType 对象错误,它不起作用。有没有更好的方法来获取表格代码并将其放入数据框中?谢谢。

【问题讨论】:

【参考方案1】:

您可以使用 read_html 从所有已解析的表中返回 DataFrames 的列表:

df = pd.read_html('http://www.basketball-reference.com/boxscores/200112100LAC.html')[0] # or [1], [2]
print (df)

【讨论】:

【参考方案2】:

table是BeautifulSoup中的标签对象,你应该将其转换为字符串并传递给pandas

prettify() 方法会将 Beautiful Soup 解析树转换为格式良好的 Unicode 字符串,每个 HTML/XML 标记都有自己的 行:

df = pd.read_html(table.prettify())

【讨论】:

这给出了一个列表,但由于 OP 已经按类找到了正确的表,因此将其放入 df 中,如下所示:df = pd.read_html(table.prettify())[0]【参考方案3】:

在 pd.read_html() 中直接传递汤:

df = pd.read_html(driver.page_source)

这里的驱动程序是一个网络驱动程序(在我的例子中是 chrome) 在 webdriver 中打开的链接将被传递给 pandas pd.read_html()

【讨论】:

以上是关于通过 BS4 将 Scraped Table 加载到 Pandas Dataframe 中的主要内容,如果未能解决你的问题,请参考以下文章

用抓取的数据填充 django 模型

bs4和xpath的用法

如何使用Scrapy获取stat(item_scraped_count)?

使用多进程池通过 Python 将_table_from_dataframe 加载到 BigQuery

R Shiny 在后台加载隐藏的侧边栏(使用 bs4Dash 包)

Python:数据解析(bs4 / xpath)