首页 > 解决方案 > Python 抓取:在使用 bs4 提取数据后,有没有办法在 find_all 中使用多个属性?

问题描述

我正在使用此代码从数字表中提取数据。我只需要一些数据元素,所以我将不需要的数据放在列表中后弹出。 表格示例

soup = BeautifulSoup(response.content, "html.parser")
vals = soup.find_all("span", attrs={"class": "W(39%) Fl(start)"})
for val in vals:
    PullList.append(val.text)
seq = [20, 19, 17, 16, 14, 13, 11, 10, 8, 7, 6, 5, 4, 2, 1]
for t in seq:
    PullList.pop(t)
print(PullList)

"span", attrs={"class": "W(39%) Fl(start) 仅指上面示例表的第 1,3 和 5 列中的数据。

我遇到的问题是,有时数据表包含一个负数,而 html 代码将表中的数字变为红色。跨度定义中的属性现在从“W(39%) Fl(start)”更改为“W(39%) Fl(start) C($c-fuji-red-2-b)”。因为我使用的是特定的 attrs 值,所以红色(负)数字不符合 find_all 语句要求,因此没有被拉入列表。

有没有办法在 attrs 定义中使用多个值?

标签: pythonbeautifulsoup

解决方案


您当前可以使用 css 选择器来定位该列并切掉标题

import requests
from bs4 import BeautifulSoup as bs

tickers = ['PSHAX','FKAIX']

def get_list(s, ticker):
    r = s.get(f'https://finance.yahoo.com/quote/{ticker}/risk?p={ticker}')
    soup = bs(r.content, 'lxml')
    three_year = [i.text for i in soup.select('div:nth-child(2) > span.W\(39\%\).Fl\(start\)')]
    if len(three_year) > 0:
        return three_year[1:]
    return 

with requests.Session() as s:
    for ticker in tickers:
        print(get_list(s, ticker))

推荐阅读