首页 > 解决方案 > 如何使用 BeautifulSoup 从网站上抓取特定单元格的文本

问题描述

在过去的一个小时里,我一直在尝试从网站上抓取文本,但没有取得任何进展,仅仅是因为我对如何实际使用 BSoup 知之甚少。

def select_ticker():
    url = "https://www.barchart.com/stocks/performance/gap/gap-up?screener=nasdaq"

    r = requests.get(url)
    html = r.text
    soup = BeautifulSoup(html)


    find = soup.findAll('td, {"data-ng-if:"row.blankRow"}')

    print(find)

我要去这个网站并尝试从表中获取第一个符号。现在那个符号是 BFBG

我知道这对于真正知道他们在用 BSoup 做什么但我不明白搜索内容的人来说应该非常容易,而且这个网站也不容易搜索。

感谢您的宝贵时间并感谢您的帮助!

标签: pythonbeautifulsoup

解决方案


实际上,您不能从 html 获取请求中删除第一个符号。您需要获取 json。

import urllib3
import json
http = urllib3.PoolManager()
r = http.request('GET', 'https://core-api.barchart.com/v1/quotes/get?lists=stocks.gaps.up.nasdaq&orderDir=desc&fields=symbol,symbolName,lastPrice,priceChange,gapUp,highPrice,lowPrice,volume,tradeTime,symbolCode,symbolType,hasOptions&orderBy=gapUp&meta=field.shortName,field.type,field.description&hasOptions=true&page=1&limit=100&raw=1')
print(json.loads(r.data)['data'][0]['symbol'])

你得到了第一个符号。

使用 Json,您还可以找到您可能想要废弃的所有信息。

在此处输入图像描述

以下是您通常如何找到这些 Json 的方法: 在此处输入图像描述

进入控制台、网络选项卡、xhr 选项卡并重新加载页面。如果提取的资源很多,还可以按域名过滤!:)

但是,这种语法是错误的:soup.findAll('td, {"data-ng-if:"row.blankRow"}')

您需要根据 BS4 doc https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all为 find_all 方法提供一个字典

soup.find_all('td', {'data-ng-if':'row.blankRow'})

希望这可以帮助


推荐阅读