Разобрать все элементы одного класса в Beautiful Soup - PullRequest
1 голос
/ 17 апреля 2020

Хотелось бы узнать ваш совет о том, как оптимизировать мой код. Точнее, я хочу проанализировать все элементы с этим классом «снижение-значение». Код:

import requests
from bs4 import BeautifulSoup

URL = 'https://finance.i.ua/nbu/'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/80.0.3987.163 Safari/537.36', 'accept': '*/*'}

def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('div', class_="data_container")
    currency = []
    for item in items:
        currency.append({
            item.find_all('span', class_='value-decrease').get_text(strip=True)
        })
        print(f"1 usd =  {currency} uah")

def parse():
    html = get_html(URL)
    if html.status_code == 200:
        get_content(html.text)
    else:
        print('Error')

parse()

Вывод должен быть таким (цифры указаны приблизительно):

1 usd = 27 uah
1 eur = 29 uah

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

currency - это список, который увеличивается с каждой итерацией, поэтому вы не хотите его печатать. Также value-decrease - это value -descrease (дополнительное пространство). span также вкладывается в другой диапазон. Вот исправления:

import requests
from bs4 import BeautifulSoup

URL = 'https://finance.i.ua/nbu/'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/80.0.3987.163 Safari/537.36', 'accept': '*/*'}

def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    rows = soup.find_all('tr')[1:] # find table rows and throw away header
    for row in rows:
        data = row.find('span',class_='value -decrease') # is the row a decrease?
        if data:
            currency = row.th.get_text().lower()
            value = data.span.get_text()
            print(f'1 {currency} = {value} uah')

def parse():
    html = get_html(URL)
    if html.status_code == 200:
        get_content(html.text)
    else:
        print('Error')

parse()

Вывод:

1 usd = 27.2022 uah
1 eur = 29.6341 uah
0 голосов
/ 17 апреля 2020

Я понял, что страна меняется, и я обновил свой код.

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    currency = []
    elems = soup.findAll("span", {"class": "value -decrease"})
    countries = [x.parent.previous_sibling.previous_sibling.get_text(strip=True) for x in elems]
    for i in range(len(elems)):
        cur = elems[i].get_text(strip=True).split('.')[0]
        currency.append(cur)
        print(f"1 {countries[i]} =  {cur} uah")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...