簡體   English   中英

使用Python從網頁獲取表

[英]Get Table from a Web Page with Python

關於python web抓取的知識不多。

我需要從獲得一個表頁面:

http://performance.morningstar.com/funds/etf/total-returns.action?t=IWF

我感興趣的表是這樣的: 在此處輸入圖片說明 (忽略表格上方的圖表)

這就是我現在所擁有的:

from selenium import webdriver
from bs4 import BeautifulSoup

# load chrome driver
driver = webdriver.Chrome('C:/.../chromedriver_win32/chromedriver')

# load web page and get source html
link = 'http://performance.morningstar.com/funds/etf/total-returns.action?t=IWF'
driver.get(link)
html = driver.page_source

# make soup and get all tables
soup = BeautifulSoup(html, 'html.parser')
tables = soup.findAll('table',{'class':'r_table3'})
tbl = tables[1]  # ideally we should select table by name

我要從這里開始嗎?

要從該網頁獲取數據,您可以這樣:

from selenium import webdriver
from bs4 import BeautifulSoup
import time

driver = webdriver.Chrome()
link = 'http://performance.morningstar.com/funds/etf/total-returns.action?t=IWF'
driver.get(link)
time.sleep(3)

soup = BeautifulSoup(driver.page_source, 'lxml')
driver.quit()

tab_data = soup.select('table')[1]
for items in tab_data.select('tr'):
    item = [elem.text for elem in items.select('th,td')]
    print(' '.join(item))

部分結果:

Total Return %  1-Day 1-Week 1-Month 3-Month YTD 1-Year 3-Year 5-Year 10-Year 15-Year
IWF (Price) 0.13 0.83 2.68 5.67 23.07 26.60 15.52 15.39 8.97 10.14
IWF (NAV) 0.20 0.86 2.66 5.70 23.17 26.63 15.52 15.40 8.98 10.14
S&P 500 TR USD (Price) 0.18 0.52 2.42 4.52 16.07 22.40 13.51 14.34 7.52 9.76

好的,這是我的操作方式:

from selenium import webdriver
from bs4 import BeautifulSoup

# load chrome driver
driver = webdriver.Chrome('C:/.../chromedriver_win32/chromedriver')

# load web page and get source html
link = 'http://performance.morningstar.com/funds/etf/total-returns.action?t=IWF'
driver.get(link)
html = driver.page_source

# make soup and get table
soup = BeautifulSoup(html, 'html.parser')
tables = soup.find_all('table',{'class':'r_table3'})
tbl = tables[1]  # ideally we should select table by name

# column and row names
rows = tbl.find_all('tr')
column_names = [x.get_text() for x in rows[0].find_all('th')[1:]]
row_names = [x.find_all('th')[0].get_text() for x in rows[1:]]

# table content
df = pd.DataFrame(columns=column_names, index=row_names)
for row in rows[1:]:
    row_name = row.find_all('th')[0].get_text()
    df.ix[row_name] = [column.get_text() for column in row.find_all('td')]
print(df)

有沒有更優雅的方法,例如,不循環遍歷列和行等,而是可以調用的現成方法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM