【问题标题】:Unhashable type 'slice'不可散列的类型“切片”
【发布时间】:2016-12-02 19:53:09
【问题描述】:

我正在尝试编写获取网站并跳过前 20 个字符并打印接下来的 100 个字符的代码。

这是我目前的代码:

i = 0
while i <len(urls):
    html = urllib.request.urlopen(urls[i])
    bsobject = BeautifulSoup(html.read(), "html.parser")    
    print(bsobject.body[20:120])
    i+=1

我运行它,它给了我错误“TypeError: unhashable type: 'slice'”

任何帮助表示赞赏:)

【问题讨论】:

  • bsobject.body 是一个对象,要获取其文本,请执行类似bsobject.body.string[20:120]
  • bsobject.body 是 BeautifulSoup Tag 对象,而不是字符串。它表示文档正文的解析结构,而不仅仅是字符序列。
  • 对您的循环进行旁注。一个更 Pythonic 的循环是 for url in urls:。那么你根本不需要i
  • 无关,但我实际上对这个错误感到惊讶。似乎没有任何方法可以修改现有的 slice 对象,那么为什么它不能是可散列的?
  • @AndyS 我试过这样做,shell 给了我“TypeError: 'NoneType' object is not subscriptable”。有没有办法解决这个问题?

标签: python python-3.x beautifulsoup


【解决方案1】:
for url in urls:
    html = urllib.request.urlopen(url)
    bsobject = BeautifulSoup(html.read(), "html.parser")
    print(str(bsobject.body)[20:121])

这段代码有效,我不知道为什么,但确实有效。

【讨论】:

  • 上面的 cmets 回答了为什么 bsobject.body 是 BeautifulSoup Tag 对象,而不是字符串。通过str()-ing 它,您创建了一个字符串,然后您可以使用[20:121] 对其进行切片。
猜你喜欢
  • 2020-10-08
  • 2018-10-12
  • 1970-01-01
  • 2015-07-05
  • 2017-07-11
  • 2016-03-16
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多