Я занимаюсь парсингом веб-страниц на Python и нашел это:
products = soup.find_all('li')
products_list = []
for product in products:
name = product.h2.string
price = product.find('p', string=lambda s: 'Price' in s).string
products_list.append((name, price))
Я хотел бы понять лямбда-функцию в этом случае, большое спасибо.
Вы создаете лямбда-функцию (анонимную), которая принимает s
в качестве аргумента, а затем проверяет, находится ли строка «Цена» в s
, или вы можете сказать, содержит ли s
строку «Цена». В зависимости от этого он вернет True
или False
.
Кроме того, вы сохраняете эту функцию внутри переменной string
. Итак, вы можете вызвать эту лямбда-функцию по этой переменной: string(s)
.
Вот пример (если это поможет):
>>> # Create lambda function and store inside `string`
>>> string = lambda s: "Price" in s
>>> # Check `string` indeed a lambda function
>>> string
<function <lambda> at 0x7f4c0afa1630>
>>>
>>> # Call the lambda function with an argument
>>> # Inside lambda function, now, `s = "Hello, World"` !
>>> # It will check this: `"Price" in s`, it's not:
>>> string("Hello, World")
False
>>> # Now, `s = "What is the price of milk?"`
>>> # "Price" and "price" are not same !
>>> string("What is the price of milk?")
False
>>> string("Price of milk is $69.")
True
Эта лямбда-функция аналогична этой:
def string(s):
return "Price" in s
Спасибо, теперь я понимаю лучше! Знаете ли вы, почему в «products_list.append((имя, цена))» две пары круглых скобок?
Пожалуйста! Итак, обратите внимание, что для двух круглых скобок вы определили список: products_list = []
и позже вы добавляете (т. е. добавляете) к нему, но вы добавляете кортеж, а не отдельный элемент. Если разобрать это утверждение на части, может стать ясно: products_list = []
product = ( "milk", 10)
products_list.append(product)
. Короче говоря, одна скобка предназначена для самого метода append
, а другая для кортежа (т. е.: (name, price)
).
извините, форматирование кода сбивает с толку, но надеюсь, что это поможет. (вы можете скопировать и вставить код в ide и отформатировать его, чтобы понять, не кажется ли это запутанным 😅)
Для каждого элемента-потомка
p
текстовое содержимое будет передано в лямбда-функцию; если текст содержит строку «Цена», элемент будет возвращен (т. е. выигрывает первое совпадение).