1. Python / Говнокод #15899

    −102

    1. 1
    l.add_xpath('price', '//table[3]/tr/td[2]/table[1]/tr[1]/td[3]/table/tr[3]/td/table/tr[2]/td/text()', lambda x: '.'.join(x))

    Запостил: kyzi007, 05 Мая 2014

    Комментарии (42) RSS

    • показать все, что скрытоЛакни мои яйца, обдолбок.
      Ответить
    • в чем гуана?
      Ответить
      • В поиске элементов по номерам ячеек и хардкорной четырехярусной табличной верстке, видимо.
        Ответить
        • Нужно больше вложенных таблиц.
          Ответить
        • Ну тогда и я рядом отложу
          god_xpathes = {'name': '/html/body/div/div[2]/div[6]/div/div/div[2]/div/div[2]/a',
                  'motto': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[2]/div[2]',
                  'character': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[3]/div[2]',
                  'guild': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[4]/div[2]/a',
                  'level': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[5]/div[2]',
                  'inventory_num': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[6]/div[2]',
                  'health': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[7]/div[2]',
                  'quest': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[8]/div[3]',
                  'gold': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[9]/div[2]',
                  'monsters_killed': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[10]/div[2]',
                  'death_count': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[11]/div[2]',
                  'arena_won': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[12]/div[2]',
                  'bricks_count': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[13]/div[2]',
                  'distance': '/html/body/div/div[2]/div[6]/div/div/div[2]/div[16]/div[2]',
          }
           
          god = {}
          for k, v in god_xpathes.items():
              god[k] = browser.find_element_by_xpath(v).text.encode('utf-8')
          Ответить
          • Не исповедимы XPath'ы господни!
            Ответить
          • >browser.find_element_by_xpath(v)
            Зачем?

            >text.encode('utf-8')
            Зачем?
            Ответить
            • 1. api такое http://selenium-python.readthedocs.org/en/latest/locating-elements.html#locating-by-xpath. Что конкретно смущает?

              2. текст в утф нужен был
              Ответить
              • 1. А, селениум. Я к lxml привык.

                2. Обычно текст хранят в юникоде и кодируют при надобности.

                Да и говна не вижу.
                Ответить
                • > Да и говна не вижу
                  А вот это тогда что?
                  /html/body/div/div[2]/div[6]/div/div/div[2]/div[16]/div[2]
                  Ну хотя там верстале поди вломы было айдишки давать этим элементам, а тестерам запретили править верстку, вот и выкручиваются :)
                  Ответить
                  • >А вот это тогда что?
                    >вероятно, он просто выковыривает xpath, который любезно генерит Firefox, и не парится
                    Ответить
          • Плохо даже не потому, что длинно, а потому, что не поддерживаемо. Где-то в начале страницы добавилась еще одна ссылка в меню / один элемент в таблице, и все регрешн тесты можно выбрасывать.
            Ответить
            • Ну как только сломается мы об этом узнаем прямо сразу потому что парсеры работают постоянно. Другое дело что такой поиск ощупкой будет с большой вероятностью ломаться на каком то проценте запросов. Но я делала более адекватные выборки - по содержимому и соседям, студент который пишет простые парсеры такие вещи не умеет.
              '//td[text()="ISBN"]/..//a'
              '//td[@class="pageBar"]/../following::td//a[not(@class)]/@href'

              Ответить
              • > студент который пишет простые парсеры такие вещи не умеет

                вероятно, он просто выковыривает xpath, который любезно генерит Firefox, и не парится
                Ответить
                • И в этом на 100% прав.
                  Ответить
                  • Нет, не прав. Потому что надо найти не на одной странице а на всех, такое ломается где то на одной из сотен страниц с большой вероятностью.
                    Ответить
                    • Страницы генерируются cms-ками. Там хоть регекспами можно искать код, который подставляется cms-кой в шаблон.

                      Если ломается абсолютный xpath, как правило, был сделан какой-то редизайн и сломается и cssselect. Плюс, не всегда у нужного элемента есть уникальный id или class. Или вообще какой-то.
                      Ответить
                      • Могут быть кейзы от которых меняется верстка и которых на конкретном урле нету.
                        Ответить
              • Так это ж не поломка, если кнопку перенесли в другое место - это закономерное изменение, которое не должно вызывать поломку тестов. Т.е. смысл делать регрешн тесты: чтобы убедиться, что ничего не сломали в новой версии, а если один и тот же тест не может работать с новой и старой версией - это тут же отменяет его полезность в этом плане.
                Ответить
                • А, я поняла тебя. Это не тесты, это грабитель чужой инфы.
                  Ответить
                  • >грабитель чужой инфы.
                    Ворюга! Пират! У-у-у-у!
                    Ответить
                  • ну так уже не грабят. Есть вполне себе более менее универсальные алгоритмы для распарсивания страниц.
                    http://habrahabr.ru/company/mailru/blog/200394/
                    соррь за хабр. с HTML5 все еще проще.
                    Ответить
                    • С json все еще проще.
                      Ответить
                    • Ага, и они точно знают что тут надо дернуть аякс а тут выбрать данные из жаваскрипта. И программировать тоже умеют. И все характеристики товара сама найдет из строки "Имя книги / блалабла автор / серия обложка". И выделит из урла айди. И догадается что вот на этом сайте айди не в урле а в особенном атрибуте.
                      Ответить
                      • Речь шла только из автоматизации выдергивании инфы из статических html...
                        Ответить
                        • Ну это в любом случае не мой вариант (я работаю в конторе которая только сбором и анализом занимается). Мне еще плагин к броузеру для автоматизации предлагали. Очень актуально для серверов.
                          Ответить
                          • >я работаю в конторе которая только сбором и анализом занимается
                            Т.е. граббингом чужих страничек?

                            >Мне еще плагин к броузеру для автоматизации предлагали. Очень актуально для серверов.
                            ?
                            Ответить
                            • На серверах которые выполняют парсинг их нету (рассказывать почему?).
                              Не страничек, магазинов аля ебей.
                              Ответить
                              • Это в смысле Селениум? Так он может работать с браузером, которому не нужен Х, забыл как называется, Рино-чего-то-там.
                                Ну а кроме него есть w3m, Linx... Очень полезные вещи, когда нужно проверить как что-то работает на сервере, на который нет доступ через HTTP.
                                Ну и Хром писался исторически как бот собирающий информацию из загруженых и выполненых страниц (т.е. со всеми ж.скриптами и КССами, одно время говорят он и с Ихаботом дружил - это автоматизированый Флеш плеер, и со всякими парсерами ПДФ / ППТ и чего там только не было).
                                У нас например наша сборка Хрома на сервере занимается конвертацией флешевых роликов в видео.
                                Ответить
                                • Гы, у меня уже мозг перемкнут.
                                  Ответить
                                • >конвертацией флешевых роликов в видео
                                  В смысле флешек? Не видео, играющегося в флеш проигрывателях?
                                  Ответить
                              • >Не страничек, магазинов аля ебей.
                                Если нужная информация грузится через аякс, все обычно упрощается, т.к. там json. Во вк там, правда, передается html в json :)
                                Ответить
                        • Статических = где инфа не подгружается аяксом.
                          Ответить
                    • Короче, такая система будет работать только в мире где нету сайтиков аля говнокод. Даже крупные сайты отжигают, что уж говорить о мелочи.
                      Ответить
                      • > говнокод
                        У говнокода есть в меру статические страницы.

                        А вот за избыточную подгрузку по мере надобности надо убивать, это точно.
                        Ответить
                        • >за избыточную подгрузку
                          Это как ?
                          По опыту скажу в 146% случаев бывает так, все на страницу вываливается в надежде, что нибудь, когда нибудь, кому нибудь пригодится.
                          Ответить
                          • Это твиттер.
                            Когда делали последний сайт твиттера, явно надеялись, что никто не будет смотреть больше топ-10 записей в блоге. Другим я такую несуразность объяснить не смогу.
                            Если крутить до бесконечности и дальше, то нельзя ни поставить закладку на том, где остановился, ни нормально обработать хождение вперёд-назад по истории. Ну и ко всему прочему, страница тупо уронит браузер, когда закончится память.
                            Ответить
                            • Вот в мобильной версии - нормальные кнопки, мусора меньше и тормозит меньше. Если немного растянуть окно в ширину, можно использовать на нормальных устройствах.
                              Ответить
          • Твое лучше )
            Ответить
    • В чем говно? Сисек тоже нет.
      Ответить

    Добавить комментарий