当我在循环中运行此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
两者有什么区别?为什么美丽的汤能够访问那些数据,但我的能力却无法获取。
答案 0 :(得分:1)
基本上,它不是使用字符串索引,而是使用字符串作为哈希表的键。你从Beautiful Soup获得的是一种映射类型,而不是顺序类型。
尝试打开您在解释器中显示的示例代码。打印汤调用返回的t
中的每一个的类型。我希望你会发现它们是字典而不是列表或字符串。
你要做的是使用字符串索引在字符串中索引,这不起作用 - 字符串和列表等顺序类型可以用整数索引,但不能用字符串索引。
另一方面,映射类型包含键值对。它们采用可以生成一致哈希的东西,并使用它来查找值。字典是Python中最常见的映射类型。其他对象和类也可以通过实现__getitem__(x)
魔术方法来实现键查找行为。
以下是Python 2标准库文档的链接:
映射类型 - https://docs.python.org/2/library/stdtypes.html#mapping-types-dict
答案 1 :(得分:0)
soup.find_all
返回bs4.element.Tag
个对象的列表。在循环中,您可以访问此列表的对象,通过编写,您可以获得元素的 title 属性。
lister = ["hello", "how are you"]
只是一个字符串列表