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

    −92

    1. 1
    2. 2
    3. 3
    4. 4
    # ....цикл....
    massiv['Текст статьи'].append(BeautifulSoup(urllib.request.urlopen(link).read()).select('.news-detail'))
    # ....цикл....
    return massiv

    Взято отсюда https://plus.google.com/u/0/109791202896921426720/posts/JagdUYx2d67

    Запостил: lig, 08 Августа 2013

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

    • Паттерн "связка сосисок".
      Ответить
    • Нафига питоновский суп, когда есть нативный lxml? Когда я в последний раз его трогал (это было давно), он вообще не работал.
      Ответить
      • Суп вроде как нормально ест некорректный HTML. Не уверен насчет lxml.
        Ответить
        • Он у меня даже корректный не ел. С lxml все в порядке. В любом случае, скорость работы там должна быть на порядок хуже сишного lxml.
          Ответить
          • Ну насчёт скорости охотно поверю. А вот насчет того что он html не ел... может, всё же неправильно готовили? Во всяком случае, мне недавно довелось с ним работать, вроде всё окей.
            Ответить
            • >недавно
              Может, в этом проблема? Я его пробовал году так в 2010.

              Методом тыка было определено, что он не переваривал одинарные кавычки.
              Ответить
    • >новичек
      А вот за такое надо сразу убивать.
      Ответить
    • Кстати, менее заметное говно:
      1. супу можно задать фильтр для элементов, которые вообще стоит записывать в дерево. Фильтр, конечно, более убогий чем механизмы выборки из готового дерева, но всё равно помогает. Мне пригодилось, когда нужно было выдрать одинокий script без src из страницы.
      2. Во умолчанию текстовые элементы, возвращаемые супом - не строки, а узлы, которые помнят свои родительские элементы. Так что после выполнения этой строчки всё разобранное дерево документа останется в памяти.
      Ответить
      • 1. xpath же. Суп в него не может?
        2. Там не слабые ссылки? Пичально. Не знаю, как в lxml.
        Ответить
        • 1. Для XPath нужно существующее дерево документа, не? А механизм о котором я говорю вроде как работает еще до построения полноценного DOM-дерева.
          2. Нет, не слабые. И по-моему это так и задумано, иначе нельзя будет гарантированно ходить по DOM-дереву, имея ссылку на узел из него. Если очень надо, есть метод для выдирания узла с потомками из контекста дерева, хотя в данном случае можно и проще.
          Ответить
          • 1. Разница, не считая памяти, будет, имхо, минимальная.
            2. Может привести к пичальке, когда ты открываешь кучу документов и сохраняешь из каждого кусочек дерева в надежне, что остальное будет убито - авотхер. lxml тоже имеет метод getroottree()

            В инете рекомендуют deepcopy(), но если оно сохранит ссылки на ненужные элементы дерева, я не вижу, чем это должно помочь.
            Ответить
          • Проверил - таки да, элементы из дерева не дают удалить дерево. copy(элемент) решает проблему (ну или deepcopy() для дерева).
            Ответить
            • http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#Improving%20Memory%20 Usage%20with%20extract
              Ну тащем-то это описано, но кто же в наши дни читает документацию? Если не заработает, спрошу на stackoverflow.
              Ответить
              • Проблема обычно в том, что У автора Все Работает, а вот у юзера, внезапно, нет. И начинается волейбол, у кого руки кривые.

                Я lxml имел в виду, на супе похожая проблема?
                Ответить
                • Я суп и имел ввиду, но, судя по вашему вопросу, lxml тем же страдаетотличается. =)
                  Ответить
          • А вот pyreadline - говнище, под виндой не дает юзать F7.
            Ответить
          • И еще, из нового lxml удалили .cssselect(), теперь для него нужно ставить внешний модуль. То есть, старые программы на новом lxml внезапно перестанут работать и надо будет ручками поставить модуль cssselect. Эт как?
            Ответить
            • Это хз что.
              Удалили в версии для третьего питона хоть, или посредине ветки снесли?
              Ответить
              • В двойке тоже. Обновил lxml - хуяк и эксепт вылетает, типа модуль не найден. И главное, виндовый инсталлятор зависимости-то не ставит, на питухе pip install lxml небось автоматом cssselect ставил. Вот почему, сука, питон - такая вендовраждебная хуйня?
                Ответить
                • Охренеть. Чтоб у них после апдейта прошивки авто рулевое колесо отвалилось! Причем на ходу.
                  Ответить
                  • >Чтоб у них после апдейта прошивки авто рулевое колесо отвалилось
                    Боюсь подумать если б на пхп написали...
                    Ответить
                  • Сейчас специально проверил еще раз - интересующимся рекомендую скачать исходники lxml, посмотреть lxml-3.2.3\src\lxml\cssselect.py и изучить setup.py на предмет наличия 'cssselect'. То есть, они и на прыщах хотят, чтобы юзер ручками ставил зависимости.

                    In [3]: r=lxml.html.document_fromstring('<b>')
                    
                    In [6]: r.cssselect('a')
                    <...>
                    ImportError: cssselect seems not to be installed. See http://packages.python.org/cssselect/

                    Вот какая моча бьет в голову даже авторам довольно серьезных расширений.
                    Ответить

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