【问题标题】:python - beautifulsoup - TypeError: sequence item 0: expected string, Tag foundpython - beautifulsoup - TypeError:序列项 0:预期的字符串,找到标记
【发布时间】:2013-01-10 17:48:25
【问题描述】:

我正在使用 beautifulsoup 从 html 字符串中提取图像和链接。这一切都很好,但是对于某些在链接内容中有标签的链接,它会引发错误。

示例链接:

<a href="http://www.example.com"><strong>Link Text</strong></a>

Python 代码:

soup = BeautifulSoup(contents)
links = soup.findAll('a')
for link in links:
    print link.contents # generates error
    print str(link.contents) # outputs [Link Text]

错误信息:

TypeError: sequence item 0: expected string, Tag found

我真的不想遍历链接文本中的任何子标签,我只是想返回原始内容,这对 BS 可行吗?

【问题讨论】:

  • 原始内容 == 只是可见文本?还是您希望它返回&lt;strong&gt;Link Text&lt;/strong&gt;
  • 对不起,我的意思是文本加上标签是什么,所以在这种情况下,我希望它输出 Link Text

标签: python beautifulsoup


【解决方案1】:

要仅抓取标签的文本内容,element.get_text() method 可让您从当前元素(包括标签)中抓取(剥离)文本:

print link.get_text(' ', strip=True)

第一个参数用于连接所有文本元素,将strip 置于True 意味着所有文本元素首先去除前导和尾随空格。在大多数情况下,这会为您提供整洁的处理文本。

您也可以使用.stripped_strings iterable:

print u' '.join(link.stripped_strings)

这本质上是相同的效果,但您可以选择先处理或过滤剥离的字符串。

要获取内容,请在每个子项上使用str()unicode()

print u''.join(unicode(item) for item in link)

这将适用于 ElementNavigableString 包含的项目。

【讨论】:

  • 是的 - bs4 在这方面是一个巨大的改进
  • @JonClements:现在,如果他们将其添加到NavigableText 类型中(只需将文本内容作为一项返回),我们就可以循环遍历结果集无需测试属性即可。
  • 对我来说它说TypeError: 'NoneType' object is not callable,虽然有一个内容,即我可以在出现错误之前print它。
  • @Hi-Angel:没有上下文,我帮不了你。也许问一个新问题?
  • @Hi-Angel:版本4使用包名bs4from bs4 import BeautifulSoup.
猜你喜欢
  • 2017-11-20
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2021-05-06
  • 2020-04-28
相关资源
最近更新 更多