大家早上好
我最近开始使用BeautifulSoup并观看视频并阅读它,目的是每天通过网络抓取股价信息,并将其添加到包含历史股价的先前填充的csv文件中。
我已经对我的代码进行了几次修改(下面),无论我是否使用“div”或“span”元素然后添加完整的类名 - 我最终收到空括号“[]”作为我的打印在控制台中。
我使用的网站是雅虎财经 - 所以我尝试使用另一个网站,Sharenet,也是同样的问题。然后我尝试抓取网站的另一部分(仅限共享名称) - 也是空括号。我收到结果的唯一一次是当我刮掉一个嵌有几个项目的“div”时 - 在打印输出中我可以看到股价信息,但肯定有办法只获得价格吗?
我一直在youtube上使用以下视频作为指南,这篇文章非常有用,以及之前的帖子有类似的问题,但我仍然遇到问题。
https://www.youtube.com/watch?v=XQgXKtPSzUI
import yahoo finance stock price with beautifulsoup and request
下面是我的代码(我使用的是python 2.7):
import urllib2
from bs4 import BeautifulSoup as soup
#Opens the connection and downloads the webpage
kio_site = urllib2.urlopen("https://finance.yahoo.com/quote/KIO.JO?p=KIO.JO")
#This will print all the html on the webpage
kio_html = kio_site.read()
#Now closing the internet connection that you opened before
kio_site.close()
#now you want to parse the html file
page_soup = soup(kio_html, "html.parser")
#Specifically find certain elements
kio_info = page_soup.find_all("span", {"class":"Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)"})
print kio_info
当我改为使用以下代码时,我得到一个结果,但股价在所有混乱中:
kio_info = page_soup.find_all("div", {"class":"My(6px) smartphone_Mt(15px)"})
在打印输出中,我还看到在股价数字之前有一个“data-reactid”=“14”,但即使我把它包括在我的代码中(连同“span”和“class”“Trsdu) (0.3s)“等)它也没有给我价格。
我阅读网页的方式不应该是html吗?我尝试使用lxml但出错了。
提前感谢您的帮助!
答案 0 :(得分:0)
我建议使用requests
库。但是,这不是问题所在。由于使用默认User-Agent
并返回不同的响应,该网站正在识别Python脚本。
您可以使用User-Agent
模块传递假requests
,以使脚本看起来像真正的浏览器。
您可以使用:
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
r = requests.get('https://finance.yahoo.com/quote/KIO.JO?p=KIO.JO', headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
print(soup.find_all("span", {"class": "Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)"}))
输出:
[<span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="35"><!-- react-text: 36 -->33,101.00<!-- /react-text --></span>]
或者,使用它来获取值:
print(soup.find("span", {"class": "Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)"}).text)
输出:
33,101.00