在Python中抓取表格数据

时间:2019-02-15 12:53:43

标签: python pandas

我想通过网络抓取从网站获取数据,但在to_html中出现错误

import requests
import pandas as pd


 url= 
'https://www.nseindia.com/live_market/dynaContent/live_watch/equities_stock_watch.htm'
 html = requests.get(url).content
 df_list = pd.read_html(html)
 df = df_list.to_html(html)
 print (df)
 df.to_csv('my data.csv')

错误:


AttributeError                            Traceback (most recent call last)
<ipython-input-35-61d14e08ca97> in <module>()
      5 html = requests.get(url).content
      6 df_list = pd.read_html(html)
----> 7 df = df_list.to_html(html)
      8 print (df)
      9 df.to_csv('my data.csv')

AttributeError: 'list' object has no attribute 'to_html'

4 个答案:

答案 0 :(得分:0)

我相信需要通过索引选择DataFrame列表的第一个值:

df = df_list[0]
print (df)
          0
0  No Data.

df.to_csv('my data.csv', index=False)

详细信息

df_list = pd.read_html(html)
print (df_list)
[          0
0  No Data.]

答案 1 :(得分:0)

尝试以下操作:

pip install lxml
pip install html5lib
pip install BeautifulSoup4

现在您无需导入请求。

import pandas as pd
import html5lib
table=pd.read_html('https://www.nseindia.com/live_market/dynaContent/live_watch/equities_stock_watch.htm') 

此外,如果您打算从国家证券交易所(National Stock Exchange)抓取股票数据,则可以使用NSEpy(这是一个简单的API)来获取印度公司的股票数据。

答案 2 :(得分:0)

由于dd.read_html()返回数据帧列表,并且列表不具有属性“ to_html”,因此出现AttributeError

谈到解决方案, 您提到的页面是使用javascript呈现的。 BeautifulSoup 无法从javascript呈现的页面中抓取数据。

要访问Javascript渲染的页面,您将需要使用成熟的渲染引擎。您可以使用 phantomJS 来获取JavaScript数据。

答案 3 :(得分:0)

尝试以下操作...

# !pip install webdriver-manager
import numpy as np
import requests
from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
DRIVER_PATH = '/path/to/chromedriver'
url= 'https://www1.nseindia.com/live_market/dynaContent/live_watch/equities_stock_watch.htm'
options = Options()
options.headless = False
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.set_page_load_timeout(5)
try:
    driver.get(url)
except:
    pass
src= driver.page_source
driver.quit()
soup= bs(src, 'lxml')
table= soup.find_all('table')
table= pd.read_html(str(table[1]),header=0)[0].set_index('Symbol')
table