BeautifulSoup может получить доступ к строковым индексам, но моя программа не может - PullRequest
0 голосов
/ 24 мая 2018

Когда я запускаю эту функцию BeautifulSoup в цикле, чтобы найти заголовки тегов, я могу напечатать индексы из списка, который он возвращает.Когда я увидел это, я был сбит с толку, потому что думал, что вы не можете поместить строки в индексы любого типа.

geturl = 
requests.get("https://www.techbargains.com/category/359/laptops").text
soup = bs(geturl, "html.parser")

for t in soup.find_all("a", class_ = "details"):
    print t["title"]

Этот код работает нормально, вот код, который я написал, чтобы попытаться понять, как это работает.

def listo():
    lister = ["hello", "how are you"]
    return lister


for a in listo():
    print a["hello"]

Когда я пытаюсь запустить его, я получаю эту ошибку:

print a["hello"]
TypeError: string indices must be integers, not str

В чем разница между ними?Почему функция Beautiful Soups может получить доступ к этим данным, а моя нет.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

soup.find_all возвращает список bs4.element.Tag объектов.В вашем цикле вы получаете доступ к объектам этого списка и, записывая, вы получаете атрибут title элемента.

lister = ["hello", "how are you"] - это просто список строк

0 голосов
/ 24 мая 2018

По сути, это не индексирование со строкой, а использование строки в качестве ключа хеш-таблицы.То, что вы получаете от Beautiful Soup, является типом отображения, а не последовательным типом.

Попробуйте открыть пример кода, который вы отобразили в интерпретаторе.Выведите тип каждого из t, которые возвращает вызов супа.Я ожидаю, что вы обнаружите, что они являются словарями, а не списками или строками.

То, что вы пытаетесь сделать, это индексировать внутри строки, используя строковый индекс, который не будет работать - последовательные типы, такие как строки и спискиможет быть проиндексирован целым числом, но не строкой.

Типы отображения, с другой стороны, содержат пары ключ-значение.Они берут что-то, что может генерировать согласованный хэш, и используют это для поиска значения.Словари являются наиболее распространенным типом отображения в Python.Другие объекты и классы также могут реализовывать поведение поиска ключей, реализуя магический метод __getitem__(x).

Ниже приведены ссылки на документацию стандартной библиотеки Python 2:

Последовательные типы: https://docs.python.org/2/library/stdtypes.html?highlight=sequential%20types#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange

Типы картографирования - https://docs.python.org/2/library/stdtypes.html#mapping-types-dict

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