Что такое питон.метод get () работает в этом сценарии?


Я просматривал учебник по соскабливанию данных списка с веб-страницы, и у нас есть красивый объект Soup с именем "суп", я должен найти все элементы из "супа", такие что они находятся в таблице, а элемент находится в некотором классе, поэтому они сделали это:

> [t["class"] for t in soup.find_all("table") if t.get("class")]

Поэтому я не понимаю 2 вещи здесь, что t["class"] делает здесь, почему мы просто не написали t, так как условие if применяется справа, почему мы должны делать t["class"] в первую очередь.

И почему мы с помощью.метод get () как boolean в этом случае, я имею в виду, не возвращает ли он значение, сохраненное для ключа в словаре?

Означает ли это, что прекрасный объект супа-это словарь?

3 2

3 ответа:

" что здесь делает t ["класс"], Почему мы просто не написали t " *

Очевидно, потому, что автор хотел получить атрибут class тега, а не полный тег.

Почему мы используем .метод get () как boolean в этом случае, я имею в виду, не возвращает ли он значение, сохраненное для ключа в словаре?

dict.get(key[, default=None]) действительно возвращает значение для ключа key, если он установлен, или default (который по умолчанию равен None), Если это не так.

Цель здесь очевидно, чтобы получить только class для тегов, имеющих один.

Означает ли это, что прекрасный объект супа-это словарь?

Здесь 't' - это не "прекрасный объект супа", это экземпляр Tag. И хотя он не является строго dict, он действительно ведет себя как один атрибут wrt / html. Это документально подтверждено FWIW.

dict.get возвращает значение, связанное с заданным ключом, или None. В качестве примера:

>>> foo = {'spam': 'eggs'}
>>> foo.get('spam')
'eggs'
>>> foo['spam']
'eggs'
>>> foo.get('bar')
None
>>> foo['bar']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'bar'

Я не знаком с BeautifulSoup, поэтому в этом случае может потребоваться сделать что-то подобное, но обычно вы просто проверяете членство, прежде чем включить

[t['class'] for t in soup.find_all('table') if 'class' in t]

Или реже используйте dict.get в селекторе и отфильтруйте объекты None после

tmp = [t.get('class') for t in soup.find_all('table')]
result = filter(tmp, None)
# this is equivalent to:
# result = [v for v in tmp if v]

Это пример вашего урока, вы, вероятно, не хотите получить текст, а не класс

Я напишу список compreheision в формате "for":

result = []
tables = soup.find_all("table")
for t in tables:
    if t.get("class"): #Check if tables have class attribute
        result.append(t["class"]) #Probably you don't wan't the class name of the table, maybe you wan't the text