【问题标题】:Get company name from a Google Finance page with Python使用 Python 从 Google 财经页面获取公司名称
【发布时间】:2016-07-03 16:38:23
【问题描述】:

我想使用 div 类 appbar-sn-p-primary 从 Google 财经页面打印公司名称。我正在使用的代码不返回任何内容或 []。无法使用 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))

【问题讨论】:

    标签: python class beautifulsoup google-finance


    【解决方案1】:

    这是一个类,而不是一个 ID

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

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

    所以它是divclass="appbar-snippet-primary",而不是你的代码所暗示的id="appbar-snippet-primary"

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

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

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

    使用硒

    你可以使用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
    

    【讨论】:

    【解决方案2】:

    该值不是Javascript动态生成的,它在源代码中,你需要做的就是添加一个user-agent并使用正确的标签名称,下面使用requests的例子得到了什么你想要的:

    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
    

    现在没有用户代理

    In [21]: from bs4 import BeautifulSoup
    
    In [22]: import requests
    
    In [23]: html = requests.get('https://www.google.com/finance?q=F').content
    
    In [24]: soup = BeautifulSoup(html, "html.parser")
    
    In [25]: x = soup.find("div", class_="appbar-snippet-primary")
    
    In [26]: print(x)
    None
    

    并且 x 是 None,因为您不会返回相同的源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2016-09-27
      相关资源
      最近更新 更多