使用Python从Google财经页面获取公司名称

时间:2016-07-03 16:38:23

标签: python class beautifulsoup google-finance

我想使用div class appbar-snippet-primary从Google财经页面打印公司名称。我使用的代码返回none或[]。无法使用beautifulsoup访问包含公司名称的span标记。

html = urlopen('https://www.google.com/finance?q=F')
soup = BeautifulSoup(html, "html.parser")
x = soup.find(id='appbar-snippet-primary')
print(x)

感谢您的解释。我已按照您的建议更新了代码并包含了股票价格,创建了一个循环,然后将信息存储在字典中。

from bs4 import BeautifulSoup
import requests

x = ('F', 'GE', 'GOOGL')
Company = {}

for i in x:
    head = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    html = requests.get('https://www.google.com/finance?q=%s' % (i) ,   headers=head).content
    soup = BeautifulSoup(html, "html.parser")
    c = soup.find("div", class_="appbar-snippet-primary").text
    p = soup.find('span',class_='pr').span.text
    Company.update({c : p})
for k, v in Company.items():
print('{:<30} {:>8}'.format(k,v))

2 个答案:

答案 0 :(得分:1)

它是一个类,而不是ID

您感兴趣的元素看起来像这样

<div class="appbar-snippet-primary">
    <span>Ford Motor Company</span>
</div>

所以它是div class="appbar-snippet-primary",而不是id="appbar-snippet-primary",就像你的代码所暗示的那样。

该值不在原始HTML中,它需要JS首先执行

但是有一个更深层次的问题,在该页面上的JavaScript运行之前,div不会被设置,因此无法下载原始HTML并在其上运行BeautifulSoup,因为那样JS还没有被执行。

原始HTML中的script个标记之一包含:var _companyName = 'Ford Motor Company';,因此如果您坚持使用原始HTML,则可以为_companyName = grep。

使用Selenium

您可以使用Selenium,因为它会引导实际的浏览器并运行JS,然后您可以使用其class找到该元素

from __future__ import print_function

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("https://www.google.com/finance?q=F")

div = driver.find_element_by_css_selector('.appbar-snippet-primary')
company_name = div.text
print(company_name)

driver.close()

我明白了:

Ford Motor Company

答案 1 :(得分:0)

该值不是由Javascript动态生成的,它位于源代码中,您需要做的就是添加用户代理并使用正确的标记名称,以下示例使用请求获取的内容你想要的:

1[System.Guid]',
  on

返回:

from bs4 import BeautifulSoup

import requests

head = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
html = requests.get('https://www.google.com/finance?q=F', headers=head).content
soup = BeautifulSoup(html, "html.parser")
x = soup.find("div", class_="appbar-snippet-primary")
print(x)

如果我们使用<div class="appbar-snippet-primary"><span>Ford Motor Company</span></div> 运行代码来提取文本,您可以看到输出是正确的:

x.text

现在没有用户代理

In [14]: from bs4 import BeautifulSoup

In [15]: import requests

In [16]: head = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

In [17]: html = requests.get('https://www.google.com/finance?q=F', headers=head).content

In [18]: soup = BeautifulSoup(html, "html.parser")

In [19]: x = soup.find("div", class_="appbar-snippet-primary")

In [20]: print(x.text)
Ford Motor Company

并且x是,因为您没有获得相同的来源。