BeautifulSoup и Python Lambda - PullRequest
       5

BeautifulSoup и Python Lambda

0 голосов
/ 24 апреля 2018

Мне трудно понять этот код.

Я хотел бы извлечь HTML комментариев, используя BeautifulSoup и Python3.

Дано:

html = '''
       <!-- Python is awesome -->
       <!-- Lambda is confusing -->
       <title>I don't grok it</title>
       '''

soup = BeautifulSoup(html, 'html.parser')

Я искал решения, и большинство людей сказали:

comments = soup.find_all(text= lambda text: isinstance(text, Comment))

Что в моем случае привело бы к:

[' Python is awesome ', ' Lambda is confusing ']

Вот что я понимаю:

  • isinstance спрашивает, является ли text экземпляром Comment, и возвращает логическое значение.
  • Я вроде понимаю lambda.Принимает text в качестве аргумента и оценивает выражение isinstance.
  • Вы можете передать функцию в find_all

Это то, чего я не понимаю:

  • Что такое text в text=?
  • Что такое text в lambda text?
  • Какой аргумент из html передается в lambda text
  • soup.text возвращает I don't grok it.Почему lambda text передает <!-- Python is awesome --> в качестве аргумента?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Резюме

.find_all() проходит через каждую строку и пытается найти соответствие text='<our_text>. Вместо действительной строки (как в приведенном ниже примере) '<our_text>' - это функция lambda , которая в основном имеет условие.

Я объясню каждую часть этого вопроса.

text=

html = '''
       <!--Python is awesome-->
       <!--Lambda is confusing-->
       <title>I don't grok it</title>
       '''

soup = BeautifulSoup(html, 'html.parser')

print(soup.find_all(text='Python is awesome'))

Выход:

['Питон потрясающий']

Здесь text= - это только параметр (то есть аргумент), где мы можем передать регулярное выражение или другую функцию или переменную или 'string'. Просто в нашем случае это была лямбда . Далее мы объясним, что делает лямбда.

Lambda

Эта лямбда функция принимает переменную text в качестве входных данных.

Мы автоматически подаем текст каждой строки в лямбда-функцию с помощью .find_all

lambda text: isinstance(text, Comment) 

И isinstance проверяет, является ли первый аргумент. text равно Comment либо возвращает Верно ИЛИ Неверно . Пример: some_var = 'Ey man' тогда я делаю isisntance(some_var, str) -> True . Это строка (str) .

Далее мы объединяем оба из них.

soup.find_all(text= lambda text: isinstance(text, Comment))

  1. soup.find_all - проходит через каждую строку <--Python is awesome.., <--Lambda.. <title>I..

  2. У нас есть условие в .find_all(<the_condition>) и мы сохраняем строки, которые удовлетворяют этому условию

  3. Условие в нашем случае:

    3,1. Во-первых, мы проверяем не только чистый текст на английском языке и внутри тегов и / или все, что есть string . Это text=

    3,2. Текст также имеет условие, он не принимает никакого текста, только если лямбда-функция возвращает True, то есть выполняет условие лямбда .

    3,3. Лямбда условие состоит в том, что это должен быть экземпляр Comment, означающий, что только если это Комментарий , он вернет True .

Только и только если все эти условия выполняются, мы берем эту строку и сохраняем ее.

0 голосов
/ 24 апреля 2018

Что такое текст в тексте =?

Ключевой аргумент функции find_all

Что такое текст в лямбда-тексте?

Параметр для функции такой же, как

def <name>(text)...

Какой аргумент из html передается в лямбда-текст

это будет зависеть от вас, в примере переменная Comments ссылается на текст для разбора.

soup.text возвращается, я не впадаю в это. Почему лямбда-текст передается в качестве аргумента?

это просто пример для замены настоящим HTML

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...