BeautifulSoup可以访问字符串索引,但我的程序不能

时间:2018-05-23 21:39:30

标签: python python-2.7 beautifulsoup

当我在循环中运行此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

两者有什么区别?为什么美丽的汤能够访问那些数据,但我的能力却无法获取。

2 个答案:

答案 0 :(得分:1)

基本上,它不是使用字符串索引,而是使用字符串作为哈希表的键。你从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

答案 1 :(得分:0)

soup.find_all返回bs4.element.Tag个对象的列表。在循环中,您可以访问此列表的对象,通过编写,您可以获得元素的 title 属性。

lister = ["hello", "how are you"]只是一个字符串列表