【问题标题】:What exactly is a navigablestring (HTML)?什么是可导航字符串 (HTML)?
【发布时间】:2019-01-06 03:45:28
【问题描述】:

我目前正在尝试使用 Python 2.7 的 BeautifulSoup (bs4) 从网页中抓取文本。我的原代码如下:

string = ''
a = soup.find('div',attrs={"id":"pressrelease"})
[x.extract() for x in a.findAll('script')]
[x.extract() for x in a.findAll("span", {'class':'hidden'})]
    
for element in a:
     try:
         string += element.get_text()
        
     except Exception as e: print(e)

虽然我的代码确实为我提供了所需的文本,但它也会出现以下错误:'NavigableString' object has no attribute 'get_text'。如果代码遇到异常,我想实现一个保存 URL 的功能,但在这种情况下,我不希望保存 URL,因为即使它抛出异常,页面也被成功抓取。因此,我试图更好地理解错误到底是什么(因此我可以决定是否有意忽略这种情况)。

任何关于什么是 navigablestring 以及为什么它会导致我的代码抛出此类错误的解释将不胜感激!

【问题讨论】:

  • Reading the documentation 是学习如何使用包的唯一真正方法。花了很多精力来写它。复杂的问题没有简单的答案。
  • 嗨!如果我无法理解文档在说什么,是否可以假设我是哑巴?

标签: python html beautifulsoup


【解决方案1】:

NavigableString 是 HTML 文档中的一段文本。见the docs。您搜索的标签内至少有一个项目是一些文本,可能是一些空格。

字符串不能包含文本,它们文本,所以它们没有get_text方法,因此尝试调用这样的方法是错误的。

您可以检查每个项目以查看它是否为 bs4.element.Tag,然后再尝试对它们调用 get_text()

for item in a:
     if type(item) is bs4.element.Tag:
         string += item.get_text()

请注意,我将您的迭代变量更改为 item,因为您将其称为 element 可能已经让您认为它实际上是一个 HTML 元素,但至少在一种情况下它绝对不是.

【讨论】:

  • 感谢您的评论!我做了以下打印语句:if isinstance(x, element.NavigableString): print x 看起来 NavigableString 确实是空格,但也是两个 cmets。只是好奇,这个空白到底是从哪里来的?假设如果我们想从任何网页上抓取文本,我们可以安全地忽略任何 element.NavigableStrings 是否合理?
  • 对不起,我忘了补充:针对您的问题,我搜索的 div 包含很多孩子和他们的孩子。
  • 对标签的迭代(如for 循环)将为您提供该标签内的每个项目,其中包括其他标签、文本和 cmets。实际上这里没有错误,我只是忘记了迭代标签会产生其所有元素(也许我误读了您的问题并认为您使用的是findall而不是find)。您可能只想要a.get_text() 而不是for 循环?
  • 哇。我不敢相信我一开始就没有这样做哈哈......非常感谢你的帮助!
猜你喜欢
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2021-03-22
相关资源
最近更新 更多