python - 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 定义中使用多个值?
解决方案
您当前可以使用 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))
推荐阅读
- c++ - //usr/lib/x86_64-linux-gnu/libcrypto.so.1.1:添加符号时出错:命令行中缺少 DSO
- django - Django ModelViewSet 增加外键列表限制
- huawei-mobile-services - 在这种情况下我能做什么?
- python - 将 re.DOTALL 替换为等价物
- c# - 将一对多列表组合成一个平面对象列表 C#
- c# - Unity中如何让玩家站在特定方块上自动跳起来?
- apache-spark - 将字符串转换为时间戳
- reactjs - 如何刷新 Table 组件 onChange 事件
- javascript - 空jQuery时更改div的属性
- google-app-engine - 谷歌负载均衡器到 Cloud Run 给出 404