Ответы пользователя по тегу Beautiful Soup
  • Почему не обновляет значение переменной при перезапуске скрипта BS4?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну если вы зайдете в инспектора щелкаете правой кнопкой мыши inspect затем settings (иконка в правом верхнем углу инспектора) затем поставите галочку Disable JavaScript и обновите страницу вы увидите что стоимость перестала обновляться (так как это осуществлялось javascript'ом). Вообще это надо делать всегда когда парсишь странички средствами bs4, потому что при отключенном javascript это то как будет видеть bs4 твою страничку так как он НЕ работает c javascript.

    Это ответ почему, как поправить средствами bs4 ответ никак.
    Ответ написан
  • Как правильно составить цикл в phyton?

    Maksim_64
    @Maksim_64
    Data Analyst
    Для начала оберните ваш код тегом python.

    ваш псевдо код для сбора данных будет иметь вид
    result = []
    for url in urls:
        r = requests.get(url)
        soup = BeautifulSoup(r.content, 'html.parser')
        status = soup.find('div', class_='closed')
        titles = soup.find('h1', class_='section_hero__title')
        id= soup.find('p', class_='numer_id')
        result.append((url, status, titles, id))


    где urls это ваши urls из файла. Ваш результат будет список кортежей, где каждый кортеж имеет вид (url, status,titles,id). Полученную структуру данных легко записать в csv файл.
    можно например так.
    import csv
    with open('file.csv', mode='w') as file:
        writer = csv.writer(file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        writer.writerow(['url','status','titles','id'])
        writer.writerows(result)

    Вот так запишет ваши данные первый ряд это названия колонок в вашем csv, а потом данные. Если названия колонок не нужны то уберите строку. writer.writerow(['url','status','titles','id']) из кода.

    Ну а так я бы рекомендовал установить pandas создаьть dataframe посмотреть на него может если надо что то подправить и из него писать csv например вот так
    import pandas as pd
    
    df = pd.DataFrame(data=result,columns = ['url','status','titles','id'])
    df.to_csv('file.csv')

    здесь мы создаем фрейм и пишем csv файл в функции to_csv можно задать параметер header=False тогда имена колонок не запишутся, плюс есть параметр mode, его можно поставить в 'a' (append) и если файл уже существует он будет добавлять туда новые строки.
    Ответ написан
    3 комментария
  • Как достать ссылку?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну что бы ваш код заработал. В цикле вставьте.
    link.find('a')['href']
    Но в целом я бы изменил код и находил бы вот так а то если в span, class_='sub' более одной ссылки то не сработает.
    измененная версия
    for span in zap.find_all('span', class_="sub", limit = 3):
        for link in span.find_all('a',href=True):
            print(link['href'])
    Ответ написан
  • Как зациклить парсинг в selenium?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну в таком то виде он и вовсе будет ругаться, что не знает что такое data. А так при условии что там все парсится ну и что в orgs > 1 элемента, все сводится к изучении самых самых основ python.
    вот код по вашей аналогии (пример я привел свой)
    data = []
    for i in range(5):
        result = i**2
    
    data.append(result)

    а вот как это должно выглядеть
    data = []
    for i in range(5):
        result = i**2
        data.append(result)


    Посмотрите разницу и подправьте сами.
    Ответ написан
    Комментировать
  • При парсинге данных получаю пустой список?

    Maksim_64
    @Maksim_64
    Data Analyst
    soup.find_all('div',class_ = 'BNeawe iBp4i AP7Wnd')

    Возможно вы не отключили JavaScript в инспекторе и видите элемент который не видит парсер. Вот код у меня он возвращает список из которого легко извлечь числовое значение. У меня работает.
    Ответ написан
  • Почему не парсятся картинки?

    Maksim_64
    @Maksim_64
    Data Analyst
    img_item = item.find('picture').find('img').get('data-src')

    Если нужно полный путь до картинки то можешь сделать вот так
    img_item = 'https://a-dubrava.ru' + item.find('picture').find('img').get('data-src')
    Ответ написан
    2 комментария
  • Почему Beutifulsoup находит не то?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну для того кусочка html который вы представили вот так сработает
    whole_part  = html.find('strong',class_='f_Strong').big.text
    float_part = html.find('strong',class_='f_Strong').big.next_sibling.strip()
    print(whole_part + float_part)

    Хотя выглядит все это сомнительно, я бы поискал более стабильное решение возможно парсил бы через regex, в общем для стабильного решения думал бы что то другое. Код работает но мне не нравится.
    Ответ написан
    Комментировать
  • Почему считает не все символы?

    Maksim_64
    @Maksim_64
    Data Analyst
    где у вас print(a) вставьте вот этот код, вы выводите на печать длину массива, а нужно суммировать длины строк каждого элемента массива.
    print(sum(len(i) for i in a))
    Ответ написан
    Комментировать
  • Как вывести ссылки на всех авторов с этой страницы?

    Maksim_64
    @Maksim_64
    Data Analyst
    код рабочий в принципе немного подкорректируй последнюю часть и все
    try:
        print(a.find('a')['href'])
    except TypeError:
        pass

    добавь эту конструкцию в тело цикла for и все проверил выводит ровно все 147 ссылок.
    Ответ написан
    2 комментария