使用 Python 从 Google 财务页面获取公司名称
Get company name from a Google Finance page with Python
我想使用 div class appbar-snippet-primary 从 Google 财务页面打印公司名称。我使用的代码 returns 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))
这是 class,不是 ID
您感兴趣的元素如下所示
<div class="appbar-snippet-primary">
<span>Ford Motor Company</span>
</div>
所以它是 div
和 class="appbar-snippet-primary"
,而不是像您的代码暗示的那样 id="appbar-snippet-primary"
。
原始值不存在HTML,需要JS先执行
然而,还有一个更深层次的问题,即 div 直到该页面 运行 上的 JavaScript 才设置,因此将无法下载原始文件HTML 和 运行 BeautifulSoup 就可以了,因为那时 JS 还没有执行。
原始 HTML 中的 script
标签之一包含:var _companyName = 'Ford Motor Company';
,因此如果您坚持使用原始 HTML.
使用硒
您可以使用 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
该值不是由 Javascript 动态生成的,它在源代码中,您需要做的就是添加一个 user-agent 并使用正确的标签name,以下示例使用 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)
哪个returns:
<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,因为您没有返回相同的来源。
我想使用 div class appbar-snippet-primary 从 Google 财务页面打印公司名称。我使用的代码 returns 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))
这是 class,不是 ID
您感兴趣的元素如下所示
<div class="appbar-snippet-primary">
<span>Ford Motor Company</span>
</div>
所以它是 div
和 class="appbar-snippet-primary"
,而不是像您的代码暗示的那样 id="appbar-snippet-primary"
。
原始值不存在HTML,需要JS先执行
然而,还有一个更深层次的问题,即 div 直到该页面 运行 上的 JavaScript 才设置,因此将无法下载原始文件HTML 和 运行 BeautifulSoup 就可以了,因为那时 JS 还没有执行。
原始 HTML 中的 script
标签之一包含:var _companyName = 'Ford Motor Company';
,因此如果您坚持使用原始 HTML.
使用硒
您可以使用 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
该值不是由 Javascript 动态生成的,它在源代码中,您需要做的就是添加一个 user-agent 并使用正确的标签name,以下示例使用 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)
哪个returns:
<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,因为您没有返回相同的来源。