首页 > 解决方案 > 使用 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)',我将一无所获。我怎样才能得到我上面显示的结果?

标签: pythonpython-3.xregexlambdabeautifulsoup

解决方案


问题是从您的requestsget-request 和 Broswer 中的请求返回的 htmlview-source:https://finance.yahoo.com/quote/goog是不同的。使用 python 访问页面时,缺少目标类的 div。我通过打印 htmlrequests并与浏览器 html 进行比较发现了这一点。

以下是建议采取的步骤:

  1. 通过循环将链接结尾附加到每个 urlmylist

  2. 雅虎服务器通过读取您的请求标头并限制一些信息来检测您是机器人。您需要添加相关标头来掩饰您的请求。

  3. 我怀疑雅虎服务器只在读取您的内容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

推荐阅读