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

    @PavelMos
    При обходе с сайтов сначала получить исходный код страницы soup = BeautifulSoup(browser.page_source, 'lxml')
    а потом к нему применять разные функции - поиск linked, twitter и так далее
    То есть в main
    for website in websiteList:
    ..
    soup = BeautifulSoup(browser.page_source, 'lxml')
    linkedResult = linked(soup) # принимает на вход не url а уже разобранную структуру т.е. soup
    tgResult = telegram (soup)

    Изучай основы языка, без этого будешь на самых простых местах стопориться.
    Ответ написан
    1 комментарий
  • Как спарсить тег со вложенными в него тегами в BS4?

    @PavelMos
    Если data-tagnames="Нужный мне текст" , то это атрибуты тега. Того тега, который внутри найденного первый раз.

    for i in block:
        try:
            print ( i, ':', i.get('data-tagnames', '\r\n') )
        except Exception:
            print (i, ':','Attr.: no data-tagnames', '\r\n')
    Ответ написан
    Комментировать
  • Как конвертировать список с ценами в Float или любой формат с которым можно проводить математические операции!?

    @PavelMos
    Ты пытаешься использовать прикладные модули питона, не овладев достаточно основами языка.
    data = json.loads(data_str)
    #получается список списков из форматированной строки. 
    #Этот список списков вероятно надо загрузить в Pandas,  в таблицу.
    result = '\n'.join(map(str, data)) # 
    #join берёт список и объединяет его в строку с символом или строкой разделителем.  
    #И еще и map http://pythonicway.com/python-functinal-programming. 
    # Результат не имеет смысла для твоей задачи.
    f_res = '[Date, Amount]\n' + result #Как бы верно, если для таблицы в виде списка 
    #списков надо добавить заголовки, то можно к заголовкам присоединить  саму таблицу . 
    #Но здесь  не имеет смысла.  Cам заголовок в виде строки, а не списка из элементов, 
    #в таблице не 2, а 3 столбца, и самой таблицы в виде #списка списков уже нет - 
    #преобразована обратно в строку
    f_res1 = re.findall(r', *.*,', f_res) # непонятно что нужно найти. См. про регекспы, удобно тренироваться на #regext101.com
    f_res1_1 = ' '.join(f_res1[0:30])
    f_res2 = f_res1_1.replace(',', ' ') # тут код имеет смысл,  если предположить, что в f_res1 есть 
    #список найденных результатов и от него берётся первые 30 элементов 
    #(надо заранее проверять, есть ли в нём столько, или предусмотреть обработку ошибки).  
    f_res3 = {'price': f_res2} # допустим создаётся словарь ключ price, значение - длинная строка
    f_res4 = pd.DataFrame(f_res3, index=[0])# создать датафрейм из словаря это pd.DataFrame.from_records(...


    Можно сделать как в предыдущем вопросе
    https://qna.habr.com/q/1195350
    import pandas as pd
    req = requests.get('https://steamcommunity.com/market/listings/730/Glove%20Case')
    search = re.search('var line1=(.+);', req.text)
    data_str = search.group(1)
    data1 = json.loads(data_str) #получем с помощью json или через split список строк, 
    #который будет преобразован в 3 колонки
    data2 = [i.replace('"', '').split(',') for i in data] # обработать строки  - 
    #убрать лишние двойные кавычки, разбить каждую строку на 3 элемента
    df1 = pandas.DataFrame.from_records(data=data2, columns=['c1','c2','c3']) #загрузить, назвать колонки
    df1.dtypes()#проверить, какие типы получились при импорте, и привести колонки к нужным типам
    df1['c1'] = df1.apply(lambda x: x[1].replace(' +',''), axis=1)  #убрать из строки с датой лишние символы, 
    #но это можно было бы сделать и на каком-то из предыдущих шагов с помощью регекспа или replace
    df1['c1'] = pandas.to_datetime(df1['c1']) #преобразовать в тип datetime
    df1['c2'] = pandas.to_numeric(df1['c2']) #преобразовать в число,  пандас должен понять, что будет float
    df1['c3'] = pandas.to_numeric(df1['c3']) # преобразовать в число, паднас должен понять, что будет int


    а можно было до загрузки пройтись по списку и удалить одинарные кавычки и 2 и 3 колонки и возможно тогда бы пандас сразу их проимпортировать как float и int например так
    data3 = [(i[0].replace(' +', ''), i[1], int(i[2])) for i in data2]

    и тогда осталось бы только преобразовать в дату первую колонку датафрейма
    Ответ написан
    2 комментария
  • Как парсить истории продаж скина в стим?

    @PavelMos
    Там есть вообще все значения в т.ч. за более ранние периоды.
    Я сделал так
    req1=request...
    soup1=bs(req1.content, 'html.parser')
    result1=re.findall(re.compile(r'line1=(.*)]];'), str(soup1) ) [0] #у меня получился result1=список из одного элемента
    list1=result1.split('],[')
    out1
    Out[133]: 
    ['[["Dec 09 2015 01: +0",7.989,"44"',
     '"Dec 10 2015 01: +0",5.743,"66"',
     '"Dec 11 2015 01: +0",5.277,"73"',
     '"Dec 12 2015 01: +0",5.262,"89"',
     '"Dec 13 2015 01: +0",4.953,"66"',
     '"Dec 14 2015 01: +0",4.65,"80"',
     '"Dec 15 2015 01: +0",6.189,"67"',
     '"Dec 16 2015 01: +0",4.673,"53"',
     '"Dec 17 2015 01: +0",4.55,"44"',
     '"Dec 18 2015 01: +0",4.458,"53"',
     '"Dec 19 2015 01: +0",4.419,"61"',
    .....
     '"Aug 30 2022 07: +0",1.709,"2"',
     '"Aug 30 2022 09: +0",1.67,"1"',
     '"Aug 30 2022 10: +0",0.203,"1"',
     '"Aug 30 2022 12: +0",1.748,"1"',
     '"Aug 30 2022 13: +0",1.75,"2"',
     '"Aug 30 2022 14: +0",1.708,"2"',
     '"Aug 30 2022 18: +0",1.1,"2"',
     '"Aug 30 2022 20: +0",1.776,"1"',
     '"Aug 30 2022 21: +0",1.745,"2"',
     '"Aug 30 2022 22: +0",1.61,"1"',
     '"Aug 30 2022 23: +0",1.847,"1"',
     '"Aug 31 2022 02: +0",1.63,"1"',
     '"Aug 31 2022 03: +0",1.82,"2"',
     '"Aug 31 2022 04: +0",1.58,"1"',
     '"Aug 31 2022 06: +0",1.58,"1"',
     '"Aug 31 2022 10: +0",1.24,"1"',
     '"Aug 31 2022 11: +0",1.897,"1"',
     '"Aug 31 2022 13: +0",1.58,"1"',
     '"Aug 31 2022 14: +0",1.854,"2"',
     '"Aug 31 2022 15: +0",1.41,"1"']
    len(out1)
    Out[134]: 2816
    Ответ написан
    1 комментарий
  • Как объект с типом 'list' отображаемый в виде столбца преобразовать в строку?

    @PavelMos
    Возможно из-за того, что join делает строку из одномерного списка. А если к выходному списку ты добавляешь результат data_list, то получается уже двумерный список, так как выражение с квадратными скобками data_list = [columns[1].text] само создает список (из одного элемента).
    FIX FIX FIX FIX
    то есть spisok1.append('1') это одно, а spisok1.append('[1]') это другое. То есть какой будет в результате список зависит от того, какого типа элементы добавляются и как. Список списков [['X'],[1],[2]] просто через join он в строку не развернётся.

    Соответственно, проще всего
    data_list=[]
    ... тут цикл...
    data_list += columns[1].text #это эквивалентно data_list.extend(columns[1].text)

    и потом сделать " ".join...
    Ответ написан
  • При парсинге таблицы выдает ошибку 'NoneType' object has no attribute 'find'. Как решить?

    @PavelMos
    rows = soup.find('table',class_ ='betinfo2').find('tbody').find_all('tr')

    В питоне всё - объекты, и результаты функций возвращают объекты, к которым, как тут, последовательно применяются другие функции (в данном случае это встроенные функции объекта BS).
    find_all применяется к тому, что было получено в find('tbody'), примененному к soup.find и тд. Но из-за того ,что на предыдущем шаге ничего не нашлось, функция вернула NoneType. К которому нельзя применять find_all, рассчитанный на работу с объектом BS.
    Ответ написан
  • Нужно спарсить номера телефонов, но они появляются полсе нажатии на кнопку, как их спарсить?

    @PavelMos
    from selenium import webdriver
    import selenium
    import time
    
    driver=webdriver.Chrome('C:\\inst\\chromedriver_win32\\chromedriver.exe')
    page2='https://____.ru/gde_kupit_kvartiru/agentstva_nedvizhimosti?page=1'
    
    driver.get(page2)
    time.sleep(3)
    driver.find_element(selenium.webdriver.common.by.By.XPATH,
                        f'//*[@class="show-"]').click()
    time.sleep(4) #я задержку ставил на всякий случай, возможно, сработает и без неё, если там совсем никто с парсерами не борется
    try:
        a=driver.find_element(selenium.webdriver.common.by.By.XPATH,
                        f'//li[contains(@class, "phone-")]').text
        print ('a=', a)
    except Exception:
        print (Exception)
    try:
        b=driver.find_element(selenium.webdriver.common.by.By.XPATH,
                        f'//a[contains(@href, "tel:+")]').text
        print ('b=', b)
    except Exception:
        print (Exception)

    C:\Python36\python.exe C:/py/selen1.py
    a= +7 (926) 626-28-66
    b= +7 (926) 626-28-66

    Возможно, имея список фирм с их id типа ".../phones?company=14402101" можно по этим номерам перебрать
    Еще имхо надо потом удалить из вопроса url сайта а то вдруг найдут и поставят защиту, хотя сайт явно не такой продвинутый в этом плане как крупные.
    Ответ написан
    1 комментарий
  • Прошу помочь с организацией словаря в Python (парсинг)?

    @PavelMos
    название: автор: www.zzz.ru это {название:{автор:www.zzz.ru}} ?
    Если подразумевается, что в первом и втором цикле в all_views_hrefs и all_authors_names одинаковое число элементов, то делать цикл по длине (любого из них):

    dict_={}
    for i in range (0,len(...)):
       dict_[all_authors_names[i].text]={item_views_hrefs[i].text: item_views_hrefs[i].get('href')}
    Ответ написан
    1 комментарий
  • Проблема с сохранением в csv результата парсинга на Python. Как решить?

    @PavelMos
    Ты создаешь словарь в company , а потом пытаешься взять данные по ключам словаря из объекта soup
    Ответ написан
    1 комментарий
  • Как исправить ошибку в парсинге?

    @PavelMos
    Если следующий href с переходом на сл. страницу не находится, в цикле продолжает использоваться предыдущий href. И вообще while True само по себе не остановится. Можно флаг поставить и проверять его.
    Ответ написан
    Комментировать
  • Как спарсить pdf файлы с сайта?

    @PavelMos
    Если просто скачать файлы из директорий, то проще wget
    Если именно спарсить и именно на питоне, то нужны модули requests и bs4 ( beautifulsoup, bs ) см инструкции к ним.

    link='https://codernet.ru/media/'
    r1=requests.get(link) #создаётся объект request с содержимым, полученным в ответ от сервера. Сам по себе он не текст странички 
    r2=r1.content.decode('utf-8') #декодируется содержимое,  r2 это уже текст
    soup1=bs.find_all ('a') #парсер beautifulsoup ищет все теги <a> где стоят ссылки

    после этого посмотреть, какие ссылки - абсолютные или относительные, если относительные, добавить к ним вышестояющую часть пути и снова сделать реквест и уже по ссылкам получить имена файлов (относительные) и скачать те из них, что pdf

    f1= open ('путь", 'wb')
    r1 = requests.get('link1') 
    f1.write(r1.content)  
    f1.close()
    Ответ написан
    Комментировать
  • Как экранировать кавычки внутри кавычек?

    @PavelMos
    Конкретно в таком случае можно имхо попробовать просто по известным комбинациям заменять через replace.
    Если в строке подряд две кавычки, заменять на \""
    Ответ написан
    Комментировать
  • Как прочитать doc-файл по ссылке?

    @PavelMos
    Ты же выводишь содержимое док в консоль.

    import urllib.request
    url ='https://www.uralprombank.ru/files/misc/admiralgorshkov-15.doc'
    urllib.request.urlretrieve(url, "с:\\text.doc")


    https://docs.python.org/3.0/library/urllib.request.html
    Ответ написан
  • Сделал парсер, выдает 2 ошибки?

    @PavelMos
    А поразмыслить над ошибкой логически ? В Питоне всё, все переменные, функции - объекты. У объектов есть встроенные атрибуты, например, у строки это строковые функции. BS в работе создаёт и использует свои объекты и они также имеют свои функции, например, этот find. Но если предыдущее действие (например, функция), ничего не вернула (по каким-то причинам), и получился объект типа NoneType, может ли он иметь же встроенные атрибуты, что и нормальный объект BS ? Значит, нужно разобраться, почему создаётся объект NoneType , к которому в строке 25 применяется встроенная функция find.

    Если закомментировать title и foto, в которых проблема, то всё работает:
    [{'cena': '\n    \t                2\xa0345\xa0000\xa0руб.\n    \t            ',
      'link': 'https://irr.ru/cars/passenger/used/lexus-lx-570-vnedorozhnik-2011-g-v-probeg-117000-km-avtomat-5-7-l-advert740313755.html'},
     {'cena': '\n    \t                1\xa0200\xa0000\xa0руб.\n    \t            ',
      'link': 'https://irr.ru/cars/passenger/used/lexus-gx-470-vnedorozhnik-2004-g-v-probeg-133569-km-avtomat-4-7-l-advert750625481.html'},
     {'cena': '\n    \t                1\xa0320\xa0000\xa0руб.\n    \t            ',
      'link': 'https://irr.ru/cars/passenger/used/lexus-rx-270-vnedorozhnik-2011-g-v-probeg-115000-km-avtomat-advert749088541.html'},
     {'cena': '\n    \t                1\xa0500\xa0000\xa0руб.\n    \t            ',
      'link': 'https://irr.ru/cars/passenger/used/lexus-gs-250-sedan-2013-g-v-probeg-142145-km-avtomat-2-5-l-advert753188137.html'},
     {'cena': '\n    \t                1\xa0839\xa0999\xa0руб.\n    \t            ',
      'link': 'https://irr.ru/cars/passenger/used/lexus-lx-570-vnedorozhnik-2008-g-v-probeg-265000-km-avtomat-5-7-l-advert752860724.html'},
     {'cena': '\n    \t                845\xa0000\xa0руб.\n    \t            ',
      'link': 'https://irr.ru/cars/passenger/used/lexus-rx-350-vnedorozhnik-2006-g-v-probeg-196000-km-avtomat-3-5-l-advert752339702.html'},
     {'cena': '\n    \t                1\xa0400\xa0000\xa0руб.\n    \t            ',
      'link': 'https://irr.ru/cars/passenger/used/lexus-ls-460-sedan-2012-g-v-probeg-390000-km-avtomat-advert744369992.html'},
     {'cena': '\n    \t                3\xa0900\xa0000\xa0руб.\n    \t            ',
      'link': 'https://irr.ru/cars/passenger/used/lexus-lx-limuzin-2010-g-v-probeg-44000-km-avtomat-advert699227821.html'},
     {'cena': '\n    \t                3\xa0400\xa0000\xa0руб.\n    \t            ',
      'link': 'https://irr.ru/cars/passenger/used/lexus-lx-570-vnedorozhnik-2013-g-v-probeg-75000-km-avtomat-advert753194033.html'}]
    Ответ написан
    Комментировать
  • Как спарсить файл .doc python?

    @PavelMos
    Можно регулярными выражениями. Выражение ищет фразу от diff до цифрвой комбинации до первого "doc"
    https://regex101.com/r/XLJ1t4/1
    import re
    import urllib
    regexp1='(\/diff\/\d{1,2}-\d{1,2}.?doc)'
    f=urllib.request.urlopen('http://1311.ru/info/info.php') #открывает, возвращает объект http (не текст)
    b=f.read() #читает из него в bytes
    text=b.decode() #из bytes в utf-8 (кодировка по умолчанию, поэтому в аргументах декод можно не писать) переводит в текст
    out=re.findall(regexp1, text)
    #далее, зная адрес сайта
    for i in out:
       print ("http://1311.ru"+i)
    http://1311.ru/diff/16-09.doc
    http://1311.ru/diff/17-09.doc

    Но тут, вероятно, надо брать самое новое расписание, тогда их надо сортировать по датам, разделяя дату и месяц, или проверять каким-то образом дату файла на сервере
    Ответ написан
    2 комментария