Python 使用BeautifulSoup刮除不带';没有唯一的标识符

Python 使用BeautifulSoup刮除不带';没有唯一的标识符,python,python-3.x,beautifulsoup,python-requests,Python,Python 3.x,Beautifulsoup,Python Requests,我以前在Python中做过少量的web抓取工作,但我一直停留在一个可能相当简单的问题上 我想从桌子上刮取一些费用 我可以得到诸如单个元素或所有速率之类的内容(因为它们都列在“fccu__slash”类下),但我不知道如何以可用的格式逐行获得结果 以下是我代码的相关部分: FCCU_url = "https://www.fccu.org/Rates/CD-Rates" FCCU_resp = requests.get(FCCU_url, timeout=3) FCCU_soup = Beautif

我以前在Python中做过少量的web抓取工作,但我一直停留在一个可能相当简单的问题上

我想从桌子上刮取一些费用

我可以得到诸如单个元素或所有速率之类的内容(因为它们都列在“fccu__slash”类下),但我不知道如何以可用的格式逐行获得结果

以下是我代码的相关部分:

FCCU_url = "https://www.fccu.org/Rates/CD-Rates"
FCCU_resp = requests.get(FCCU_url, timeout=3)
FCCU_soup = BeautifulSoup(FCCU_resp.content, "html.parser")
for elem in FCCU_soup.find_all("td"):
    try:
        print(elem.contents[0])
    except IndexError:
        print(elem.contents)
这会输出我想要的所有信息,但不是可用的格式

理想情况下,我只希望能够用我感兴趣的术语刮取CD,并以这样的格式输出结果(我只关心利率而不关心APY):

这些不是我关心的具体问题,但一旦我了解了如何做,我想自己做出调整


感谢您提前提供的帮助。

将html表全部删除,然后处理所需的单个列

熊猫在这方面做得很好

首先查找表元素

tableobject=FCCU_soup.find_all("table")
把它传给熊猫

data=pd.read_html(str(tableobject))

然后拉动并删除您不需要的列。

我尝试使用您的代码,并使用
itertools
将答案按6个元素分组

import requests
from bs4 import BeautifulSoup
from itertools import zip_longest
FCCU_url = "https://www.fccu.org/Rates/CD-Rates"
FCCU_resp = requests.get(FCCU_url, timeout=3)
FCCU_soup = BeautifulSoup(FCCU_resp.content, "lxml")
result = []
for e in FCCU_soup.findAll("td"):
    if e.find_all("span"):
        [result.append(sp.text) for sp in e.find_all("span")]
    else:
        result.append(e.text)

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return list(zip_longest(*args, fillvalue=fillvalue))

print(grouper(result,6))
输出:

['3 Month', '0.65%', '0.75%']
['6 Month', '1.44%', '1.59%']
['1 Year', '2.13%', '2.37%']
['2 Year', '2.37%', '2.62%']
['3 Year', '2.27%', '2.52%']
['4 Year', '2.37%', '2.62%']
['5 Year', '2.96%', '3.20%']
['9 Month', '0.95%', '1.09%']
['19 Month', '1.98%', '2.08%']
['2 Year²', '2.27%', '2.52%']
['4 Year³', '2.32%', '2.57%']
['2 Year', '2.27%', 'N/A']
(b'3个月,b'3个月,b'3个月,b'3个月,b'3个月,b'3个月,b'3个月,b'3个月,b'3个月,b'b'b'500,b'3个月,b'3个月,b'3个月,b'3个月,b'3个月,b'3个月,b'3个月,b'3个月,b'b'b'b'b'500,b'b'b'500,b'b'1.44个月,b'b'b'b'1.44个月,b'b'b'b'b'b'b'b'b'b'b'b'b'1.44%,b'b'b'b'b'b'b'b'b'b'1.3个月,b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'"2.27%",b"2.30%",b"2.52%",b"2.55%",,(b'4年'、b'500美元'、b'2.37%、b'2.40%、b'2.62%、b'2.65%)、


尝试以下代码以获得所需的输出:

FCCU_url = "https://www.fccu.org/Rates/CD-Rates"
FCCU_resp = requests.get(FCCU_url, timeout=3)
FCCU_soup = BeautifulSoup(FCCU_resp.content, "html.parser")
for elem in FCCU_soup.select("tbody tr"):
    cells = [td for td in elem.findChildren('td')]
    data = [cells[0].text, cells[2].span.text, cells[3].span.text]
    print(data)
输出:

['3 Month', '0.65%', '0.75%']
['6 Month', '1.44%', '1.59%']
['1 Year', '2.13%', '2.37%']
['2 Year', '2.37%', '2.62%']
['3 Year', '2.27%', '2.52%']
['4 Year', '2.37%', '2.62%']
['5 Year', '2.96%', '3.20%']
['9 Month', '0.95%', '1.09%']
['19 Month', '1.98%', '2.08%']
['2 Year²', '2.27%', '2.52%']
['4 Year³', '2.32%', '2.57%']
['2 Year', '2.27%', 'N/A']

tds是否有一个我们可以参考的结构,即它没有正确读取表,因为这会创建一个根本不代表源表的无意义的数据帧。嗯,我猜源页面中的HTML不好?@Andersson给出了一个更完整的答案。这比我认为的解决方法短10倍,更干净ut-非常感谢!