我在这里很新,很乐意得到一些帮助。我正在尝试从网站https://www.boerse.de/indizes/Dax/DE0008469008收集数据。在此网站上列出了Dax30公司。我想收集每个公司从2000年3月到2019年的所有股价。因此,我需要单击公司名称。在下一页上有一个按钮“ Historie”。加载该页面后,出现带有股票价格的页面。有一个列表,其中包含每月的股票价格。这是第二个表,称为“ Adidas Monats-Schlusskurse 2019”。当我在3月“März”上单击此按钮时,将出现一个新表“ Adidas Monats-Schlusskurse”,其中包含所有3月的股票价格。我正在使用python和beautifulsoup。我的问题是由于onclick html语法的原因,我无法到达“ Adidas Monats-Schlusskurse”表。我设法找到正确的href =#,但这不是链接,所以我无法访问想要的表。下面是我的代码:
import bs4
from urllib.request import urlopen as ureq
from bs4 import BeautifulSoup as soup
my_url = 'https://www.boerse.de/indizes/Dax/DE0008469008'
uclient = ureq(my_url)
page_html = uclient.read()
uclient.close()
page_soup = soup(page_html, "html.parser")
aktien = page_soup.findAll("a",{"class":"nobr"})
for aktie in aktien:
name = aktie.text #getting the name of the company
historie = aktie["href"] #getting the link and then open next website
hclient = ureq(historie)
h_html = hclient.read()
hclient.close()
hpage_soup = soup(h_html, "html.parser")
block = hpage_soup.find("div",{"class":"col-sm-2 navColumn"})
link = "https://www.boerse.de" + block.findAll("a")[1].get("href") #getting the link Historie
kclient = ureq(link)
k_html = kclient.read()
kclient.close()
kpage_soup = soup(k_html, "html.parser") #open website with stock prices
kurs = kpage_soup.find("div", {"id": "histKurseMonth"})
button = kurs.findAll("a")[2].get("href") #getting the link for the website with stock prices for march
#problem href="#" onclick="historieMonatJahr('DE0007472060', '3', '');return false;"
#what do I need to do to get to the stock prices for march?
#Don't know what to do with onclick
感谢您的帮助。
编辑:
多亏了Andrej Kesely,我得到了我想要的东西,但是有人能理解我的代码并且可以告诉我如何使用我的代码吗?我只需要帮助即可克服点击页面上的问题。因此,当有人只能添加代码才能进入市场时,这会很好,因为我想自己学习编程,而不希望交付解决方案。
答案 0 :(得分:0)
该页面正在执行POST请求,并通过JavaScript / JSON动态加载月份数据。
但是,当您检查(在Firefox / Chrome开发人员工具中)页面连接的位置时,您也可以通过请求获取数据。
此示例将获取每个公司和第3个月(3月)的数据,并以表格形式打印:
import requests
from bs4 import BeautifulSoup
dax_url = 'https://www.boerse.de/indizes/Dax/DE0008469008'
url = 'https://www.boerse.de/ajax/historie.php'
data = {'isin': '',
'monat': 1,
'jahr': ''}
soup = BeautifulSoup(requests.get(dax_url).text, 'html.parser')
isin = [tr['id'] for tr in soup.select('#pushList tr[id]')]
for i in isin:
data['isin'] = i
data['monat'] = 3 # 3 - only March
soup = BeautifulSoup(requests.post(url, data=data).json() , 'html.parser')
company = soup.h2.get_text(strip=True).replace(' Monats-Schlusskurse', '')
for tr in soup.select('.tablesorter tbody tr'):
monat, erster, schluss, hoch, tief, *_ = tr.get_text(separator='|', strip=True).split('|')
if int(monat.split()[-1]) < 2000:
continue
print('{:<30} {:<20} {:<20} {:<20} {:<20} {:<20}'.format(company, monat, erster, schluss, hoch, tief))
打印:
Adidas März 2019 214,50 216,60 219,80 197,25
Adidas März 2018 181,70 196,65 200,30 168,25
Adidas März 2017 157,40 178,30 185,05 157,35
Adidas März 2016 98,58 103,00 104,75 95,17
Adidas März 2015 69,38 73,69 75,10 66,80
Adidas März 2014 82,20 78,54 83,49 74,76
Adidas März 2013 69,85 80,94 83,10 69,70
Adidas März 2012 58,33 58,54 60,29 55,52
Adidas März 2011 46,84 44,46 48,15 42,60
Adidas März 2010 36,60 39,60 40,88 35,20
Adidas März 2009 22,41 25,06 26,79 22,37
Adidas März 2008 41,40 42,11 42,94 38,23
Adidas März 2007 37,30 40,93 41,24 34,50
Adidas März 2006 41,10 40,80 41,87 38,43
Adidas März 2005 28,38 30,61 30,61 27,88
... and so on.