Ответы пользователя по тегу Beautiful Soup
  • В чем преимущества bs4 перед регулярками?

    Maksim_64
    @Maksim_64
    Data Analyst
    bs4 и regex -нельзя сравнивать. bs4 это интерфейс для работы с html, xml документами, а regex - это инструмент для работы с паттернами в тексте.

    Обычно их используют вместе, я не припомню что бы я использовал BeautifulSoup без регулярок.
    HTML - структурированный документ. Для эффективного взаимодействия со структурой есть BeautifulSoup для эффективного взаимодействия с элементом структуры текстом есть regex.
    Ответ написан
    Комментировать
  • Как исправить ошибку invalid literal for int() with base 10: '0 из 90'?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты пытаешься преобразовать строку в число. А именно где то ты вот эту строку пытаешься преобразовать в число '0 из 90', ожидая что там '90' ну или '0'. То есть в буквальном смысле у тебя где то в коде происходит. int('0 из 90') Что выдаст точно такую же ошибку. Отлаживай что бы там было строковое представление целого числа.
    Ответ написан
    Комментировать
  • Как скачать видео на YouTube с помощью python3. 9 bs4?

    Maksim_64
    @Maksim_64
    Data Analyst
    Что значит спарсит видео по ссылке? beatifulsoup парсит html и xml. Что бы качать видео c ютуба средствами python, есть специальная библиотека pytube. https://pytube.io/en/latest/
    Ответ написан
    2 комментария
  • Как спарсить заголовок из title?

    Maksim_64
    @Maksim_64
    Data Analyst
    team = old.find("a")['title'] перед этим обернуть все try except потому что у тебя значение для некоторых 'a' получает значение None.
    То есть как то так
    for old in all_old_teams:
        try:
            team = old.find("a")['title']
            print(team)
        except TypeError:
            print(None)
    Ну и свою логику там настраивай собирай их куда тебе надо и т.д.
    Ответ написан
    1 комментарий
  • Как исправить ошибку в коде?

    Maksim_64
    @Maksim_64
    Data Analyst
    У тебя response.status_code равен 403. То есть html что бы парсить его супом сервер не прислал. Можно добавить ему headers.
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    response = requests.get(url, headers=headers)
    Теперь сервер пришлет html status_code должен быть 200 (по крайней мере у меня работает). Который можно парсить средствами beatifulsoup. Правильно ли написан парсинг, нет не правильно. Такого класса как ты ищешь там нет. Ну это все самостоятельно, объект сервер пришлет валидный для парсинга.
    Ответ написан
    Комментировать
  • Не получается спарсить, что делаю не так?

    Maksim_64
    @Maksim_64
    Data Analyst
    у тебя у r status_code 403. Добавь хоть какой нибудь header.
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0'
    }
    r = requests.get(url,headers=headers)

    Вот так сервер пришлет html.
    Имей также ввиду что парсить интерактивно (в рамках одного соединения) с bs не получится, придется переподключаться часто ну и схватишь блок или ерунду начнет присылать в ответ. Если ты перейдешь на страницу, зайдешь в инспектор, нажмешь на значек настройка в панели инспектора, затем поставишь галочку Disable JavaScript и обновишь страницу, вся инфа на странице перестанет обновляться. По скольку обновление происходит средствами JavaScript a bs не работает с JavaScript.
    Ответ написан
    3 комментария
  • Почему не обновляет значение переменной при перезапуске скрипта 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 комментария