2014-11-10 2 views
1

Может ли кто-нибудь помочь мне понять этот фрагмент кода из документации beautifulsoup3? В частности, я не понимаю эту часть в квадратных скобках. Код из этого URL: http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html Я не понимаю квадратные скобки, потому что я думал, что квадратные скобки предназначены для составления списков, создает ли его содержимое список? Кроме того, он, похоже, не присваивает список никому. Какова цель создания квадратных скобок и не присваивания им чего-либо? Кроме того, я не понимаю этот компонент: text=lambda text:isinstance(text, Comment), но я думаю, что смогу понять эту часть самостоятельно.Можете ли вы объяснить использование питона квадратными скобками?

from BeautifulSoup import BeautifulSoup, Comment 
soup = BeautifulSoup("""1<!--The loneliest number--> 
         <a>2<!--Can be as bad as one--><b>3""") 
comments = soup.findAll(text=lambda text:isinstance(text, Comment)) 
[comment.extract() for comment in comments] 
print soup 
# 1 
# <a>2<b>3</b></a> 

Хорошо, так что это для понимания списка, так что список делается? Но не используется? Зачем они это делают? Кроме того, когда и почему вы ставите что-либо перед словом «за»? как они там. Обычно я вижу «для» в начале, ничего не до него. Кроме того, благодарю вас за отличное объяснение функции лямбды, я знал, что это сделало какую-то мини-функцию, но я еще не был знаком с ней, это помогло понять, как вы переписали ее как обычную функцию.

+0

Линия с квадратными скобками - это [понимание списка] (https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions) – Marius

+0

oh weird, я просто попробовал это: '[print («stuff») для x в диапазоне (0,10)] ', и это сработало, поэтому« побочный эффект »квадратных скобок для определения списка состоит в том, что вы можете сделать одну строку для циклов? – jelijelidjango

ответ

4

Часть в квадратных скобках называется list comprehension - в основном короткий путь для создания списка.

Причина, по которой она не привязана ни к чему, заключается в том, что она здесь не нужна. extract() метод вызывается для каждого найденного комментария и он удаляет каждый комментарий в цикле. Это на самом деле очень странно, гораздо лучше было бы написать это следующим образом:

for comment in comments: 
    comment.extract() 

Чтобы понять, что soup.findAll(text=lambda text:isinstance(text, Comment)) ли вам нужно понять две основные вещи:

  • по text аргумент:

Текст является аргументом, который позволяет вы ищете объекты NavigableString вместо тегов. Его значение может быть строка, регулярное выражение, список или словарь, True или None, или отозваны, который принимает объект NavigableString в качестве аргумента

Обратите внимание, что, самое главное для нас здесь, является то, что значение аргумента text может быть callable, или, другими словами, функцией.

  • теперь lambda text:isinstance(text, Comment) специальный синтаксис для написания анонимных функций в Python. Это так же, как вы бы:

    def my_function(text): 
        return isinstance(text, Comment) 
    

Что она делает это он проверяет каждый объект NavigableString быть экземпляром класса Comment. Другими словами, проверяет, был ли найденный текст комментарием HTML.


Как примечание стороны, не тратить время на BeatifulSoup3, поскольку он не поддерживается и не поддерживается больше, переключатель BeautifulSoup4.

+0

Пояснение +1 не должно использоваться для побочных эффектов –

+0

Итак, каковы эти побочные эффекты, о которых вы говорите? – jelijelidjango

Смежные вопросы