Использование BeautifulSoup для очистки элементов, которые не имеют уникальных идентификаторов - PullRequest
0 голосов
/ 22 октября 2018

Раньше я немного работал с поиском веб-страниц в Python, но я застрял в том, что, вероятно, является довольно простой проблемой.

Я хочу вычеркнуть показатели из таблицы на этой странице.

Я могу получить такие вещи, как отдельные элементы или все ставки (потому что все они перечислены в классе "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)

Это выводит всю информацию, которую я хочу, но не в пригодном для использования формате.

В идеалеЯ хотел бы иметь возможность очищать диски только с интересующими меня терминами и выводить результаты в формате, подобном следующему (меня интересуют только ставки, а не APY):

['3 Month', '0.65%', '0.75%']
['6 Month', '1.44%', '1.59%']
['2 Year', '2.37%', '2.62%']

Этоне конкретные, которые меня волнуют, но как только я пойму, как это сделать, я бы сам хотел внести коррективы.

Спасибо за любую помощь заранее.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

я пытаюсь с вашим кодом и использую 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))

Вывод:

[(b'3 Месяц ', b'500 долларов США, b'0,65% ', b'0,65%', b'0,75% ', b'0,75%'), (b'6 Месяц ', b' 500 $, b'1,44% ', b'1,45%', b'1.59%', b'1.60% '), (b'1 Year', b '$ 500', b'2.13% ', b'2.15%', b'2.37% ', b'2.40%'), (b'2 Year ', b' 500 $ ', b'2.37%', b'2.40% ', b'2.62%', b'2.65% '), (b'3 Year', b '$ 500', b'2.27% ', b'2.30%', b'2.52% ', b'2.55%'), (b'4 Year ', b' $ 500 ', b'2.37%', b'2.40% ',b'2.62% ', b'2.65%'), ...

0 голосов
/ 23 октября 2018

Попробуйте следующий код, чтобы получить требуемый вывод:

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']
0 голосов
/ 22 октября 2018

Полностью очистите HTML-таблицу, а затем обработайте отдельный столбец, который вам нужен.

Панды read_html отлично справляется с этой задачей

Сначала найдите элементы таблицы

tableobject=FCCU_soup.find_all("table")

Передайте это в панды

data=pd.read_html(str(tableobject))

А затем удалите ненужные столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...