Python BS4共享信息未显示

时间:2018-02-22 09:36:59

标签: python beautifulsoup

大家早上好

我最近开始使用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但出错了。

提前感谢您的帮助!

1 个答案:

答案 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