【问题标题】:BeautifulSoup - TypeError: sequence item 0: expected str instanceBeautifulSoup - TypeError:序列项 0:预期的 str 实例
【发布时间】:2019-05-29 09:14:12
【问题描述】:

我使用 python 做了一个网络爬虫,一切都运行良好,直到它到达这部分代码:

    # Use BeautifulSoup modules to format web page as text that can
    # be parsed and indexed
    #
    soup = bs4.BeautifulSoup(response, "html.parser")
    tok = "".join(soup.findAll("p", text=re.compile(".")))
    # pass the text extracted from the web page to the parsetoken routine for indexing
    parsetoken(db, tok)
    documents += 1

我得到的错误是TypeError: sequence item 0: expected str instance,在代码中的 tok 行周围找到了标记。
我认为我的语法可能是问题,但我不确定。我该如何解决这个问题?

【问题讨论】:

  • 您传递给''.join 的不是字符串的可迭代,它必须是。 soup.findall 返回一些我只能假设的自定义对象的序列
  • 你可能需要tok = "".join([x.text for x in soup.findAll("p", text=re.compile(".")))

标签: python python-3.x beautifulsoup


【解决方案1】:

这里有几个问题:

  • 首先,我不确定您从哪里获得response,但这应该是一串实际的HTML。确保您不只是从抓取一个告诉您它是否成功的站点中捕获“响应”代码。
  • 更重要的是,当您执行“findAll”时,请注意这将返回 BeautifulSoup 对象列表,不是字符串列表。所以“join”命令不知道如何处理这些。它查看列表中的第一个对象,发现它不是字符串,这就是为什么它会出错并抱怨它“expected str instance”。好消息是您可以使用 .text 从给定的 <p> 元素中提取实际文本。
  • 即使您确实使用.text 从每个<p> 对象中提取实际文本,但如果您的列表是unicodestr 格式的混合,您的join() 仍可能失败。因此,在加入之前,您可能需要进行一些编码技巧以使所有内容都具有相同的类型。

这是我使用此页面所做的示例:

>>> import bs4, re
>>> import urllib2
>>> url = "https://stackoverflow.com/questions/3925614/how-do-you-read-a-file-into-a-list-in-python"
>>> html = urllib2.urlopen(url).read()
>>> soup = bs4.BeautifulSoup(html, "html.parser")
>>> L = soup.findAll("p", text=re.compile("."))
>>> M = [t.text.encode('utf-8') for t in L]
>>> print(" ".join(M))

这将打印在“P”标签中找到的所有内容的组合文本。

编辑:此示例在 Python 2.7.x 上。对于 3.x,删除“.encode('utf-8')”。

【讨论】:

  • 这是 Python 3,不需要text.encode('utf-8')
  • 这将在 Python 3 上工作,.encode 返回 bytes 对象,而您正在尝试使用 str 对象加入,即 " ".join,这将引发类型错误。你可以做b" ".join(...),但是,你为什么要想要 Python 3 中的字节对象呢?看,如果可以轻松编写 Python 2 和 3 来处理 unicode 字符串与字节字符串的问题,那么就不会有 没有 Python 2 和 3。但除此之外,这是正确的。
  • 好的,我已经更新了。现在回到“拔头发”,Juanpa。
猜你喜欢
  • 2020-04-28
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 2019-07-24
  • 2017-06-05
  • 1970-01-01
相关资源
最近更新 更多