Соскребание Yahoo/ Присяга Новый формат календаря доходов
Не могу понять, почему модифицированный скрипт Python ниже не работает с новым форматом календаря заработка. Похоже, он не соответствует href, который может существенно отличаться от старого формата (динамический JavaScript?).
import datetime
import requests
import bs4
import csv
def get_earning_data(date,date2):
url = "http://finance.yahoo.com/calendar/earnings?&day={}".format(date)
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0"}
html = requests.get(url, headers=headers).text
soup = bs4.BeautifulSoup(html, "html.parser")
quotes = []
for tr in soup.find_all("tr"):
if len(tr.contents) > 3:
if len(tr.contents[1].contents) > 0:
if tr.contents[1].contents[0].name == "a":
if tr.contents[1].contents[0]["href"].startswith("/quote/"):
if "." not in tr.contents[1].contents[0].text:
quotes.append(tr.contents[1].contents[0].text)
quotes.append(date2)
return quotes
outfile = "EarningsCalendar.csv"
open(outfile, 'wb').close
index = 0
while index < 7:
date = (datetime.date.today() + datetime.timedelta(index)).strftime("%Y-%m-%d")
date2 = (datetime.date.today() + datetime.timedelta(index)).strftime("%d/%m/%Y")
mylist = get_earning_data(date,date2)
print (mylist)
with open(outfile, 'ab') as csvfile:
writer = csv.writer(csvfile, delimiter=',',quoting=csv.QUOTE_NONE)
for i in range(0, len(mylist), 2):
writer.writerow(mylist[i:i+2])
index += 1
Вот пример строки исходного кода для 04-05-2017:
<tr class="data-rowKMX9 Bgc($extraLightBlue):h H(36px) Bgc($altRowColor)" data-reactid="490"><td class="data-col0 Ta(start) Pend(15px) Pstart(6px) W(10%)" data-reactid="491"><a href="/quote/KMX?p=KMX" title="Carmax Inc" data-symbol="KMX" class="Fw(b)" data-reactid="492">KMX</a></td><td class="data-col1 Ta(start) Pend(10px) W(20%)" data-reactid="493">Carmax Inc</td><td class="data-col2 Ta(end) Pstart(15px) W(10%)" data-reactid="494">0.79</td><td class="data-col3 Ta(end) Pstart(15px) W(10%)" data-reactid="495">-</td><td class="data-col4 Ta(end) Pstart(15px) W(10%)" data-reactid="496"><span class="" data-reactid="497">-</span></td><td class="data-col5 Ta(end) Pend(6px) Pstart(15px) W(13%)" data-reactid="498"><span data-reactid="499">Before Market Open</span></td></tr>
Вот пример страницы со старым форматом: http://web.archive.org/web/20170301070135/https://biz.yahoo.com/research/earncal/today.html
Единственное различие между старым и новым, которое я вижу, - это.startswith. Использование " http://finance.yahoo.com/quote/" также не работает.