Что такое питон.метод 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 ответа:
Очевидно, потому, что автор хотел получить атрибут" что здесь делает 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