python - 使用 BeautifulSoup 和 RegEx 或 Lambda 循环 URL 以进行匹配?
问题描述
我正在尝试遍历几个 URL 并刮出一个特定的类。我相信它被称为:
<div class="Fw(b) Fl(end)--m Fz(s) C($primaryColor" data-reactid="192">Overvalued</div>
这是网址:
https://finance.yahoo.com/quote/goog
这是我想要的 GOOG 数据。
Near Fair Value
我相信这将需要某种 Lambda 函数或 RegEx。我试图在不使用这些方法的情况下做到这一点,但我无法让它发挥作用。这是我正在测试的代码。
import requests
from bs4 import BeautifulSoup
import re
mylink = "https://finance.yahoo.com/quote/"
mylist = ['SBUX', 'MSFT', 'GOOG']
mystocks = []
html = requests.get(mylink).text
soup = BeautifulSoup(html, "lxml")
#details = soup.findAll("div", {"class" : lambda L: L and L.startswith('Fw(b) Fl(end)--m')})
details = soup.findAll('div', {'class' : re.compile('Fw(b)*')})
for item in mylist:
for r in details:
mystocks.append(item + ' - ' + details)
print(mystocks)
这是一个屏幕截图:
代码运行后,我想看到这样的东西。
GOOG - Near Fair Value
SBUX - Near Fair Value
MSFT - Overvalued
问题是,如果我使用这样的东西: 'Fw(b)*'
,我会拉回太多数据。如果我尝试将其扩展到 this: 'Fw(b) Fl(end)--m Fz(s)'
,我将一无所获。我怎样才能得到我上面显示的结果?
解决方案
问题是从您的requests
get-request 和 Broswer 中的请求返回的 htmlview-source:https://finance.yahoo.com/quote/goog
是不同的。使用 python 访问页面时,缺少目标类的 div。我通过打印 htmlrequests
并与浏览器 html 进行比较发现了这一点。
以下是建议采取的步骤:
通过循环将链接结尾附加到每个 url
mylist
雅虎服务器通过读取您的请求标头并限制一些信息来检测您是机器人。您需要添加相关标头来掩饰您的请求。
我怀疑雅虎服务器只在读取您的内容
user-agent
,但我将把它留给您进行实验;在这里发布完整的标题以供参考对我有好处。
可以从网络选项卡中的 chrome 开发工具中获取标头。Trillworks Online 工具展示了如何执行此操作并帮助您将它们转换为请求代码。
建议的解决方案:
import requests
from bs4 import BeautifulSoup
mylink = "https://finance.yahoo.com/quote/"
mylist = ['SBUX', 'MSFT', 'GOOG']
mystocks = []
headers = {
'authority': 'finance.yahoo.com',
'cache-control': 'max-age=0',
'dnt': '1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'sec-fetch-site': 'none',
'sec-fetch-mode': 'navigate',
'sec-fetch-user': '?1',
'sec-fetch-dest': 'document',
'accept-language': 'en,en-US;q=0.9,fr-FR;q=0.8,fr;q=0.7,ar-EG;q=0.6,ar;q=0.5,my-ZG;q=0.4,my;q=0.3',
'cookie': '', # Note: I removed the cookie value, it was too long
}
for item in mylist:
html = requests.get(mylink + item, headers=headers).text
soup = BeautifulSoup(html, "lxml")
details = soup.find('div', class_="Fw(b) Fl(end)--m Fz(s) C($primaryColor")
mystocks.append(item + ' - ' + details.text)
print(mystocks)
这打印:
GOOG - Near Fair Value
SBUX - Near Fair Value
MSFT - Overvalued
推荐阅读
- visual-studio - Visual Studio Pro 2017 中不提供客户端调试
- python - 使用 Pytest 测试条件语句
- java - Hibernate 5 @ManyToMany 无法插入重复键
- c# - 无法使用 Twilio 短代码向我的印度号码发送短信
- json - 如何在 JSON 请求中发布图像?
- css - 找不到背景图片java cycloon
- xero-api - XERO api - 按联系人 ID 过滤预付款
- excel - 工作表函数与代码的 Excel VBA 性能,用于数组
- node.js - 如果我在 Node JS 中删除模型类 (.js) 会发生什么
- bluetooth-lowenergy - 一个BLE特性中多个字段的字节顺序