.string 和 .text BeautifulSoup 的区别

新手上路,请多包涵

我在使用 BeautifulSoup 时注意到一些奇怪的事情,并且找不到任何文档来支持这一点,所以我想在这里问一下。

假设我们有一个像这样的标签,我们已经用 BS 解析了:

 <td>Some Table Data</td>
<td></td>

官方记录 的提取数据的方法是 soup.string 。然而,这为第二个 <td> 标签提取了一个 NoneType。所以我尝试 soup.text (因为为什么不呢?)它完全按照我的需要提取了一个空字符串。

但是我在文档中找不到对此的任何参考,并且担心有什么遗漏。谁能告诉我这是否可以使用,或者以后会不会引起问题?

顺便说一句,我正在从网页中抓取表格数据,并打算从数据中创建 CSV,因此我实际上需要空字符串而不是 NoneTypes。

原文由 mez.pahlan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 800
2 个回答

.string 在一个 Tag 类型的对象上返回一个 NavigableString 类型的对象。另一方面, .text 获取所有子字符串并使用给定的分隔符连接返回。 .text 的返回类型是 unicode 对象。

根据 文档,A NavigableString 就像 Python Unicode 字符串,除了它还支持 导航树搜索树 中描述的一些功能。

.string文档 中,我们可以看到,如果 html 是这样的,

 <td>Some Table Data</td>
<td></td>

然后, .string 在第二个 td 将返回 None 。但是 .text 会返回一个空字符串,它是一个 unicode 类型的对象。

为了更方便,

string

  • a tag 的便利属性,用于获取此标记中的单个字符串。
  • 如果 tag 有一个子字符串,则返回值为该字符串。
  • 如果 tag 没有孩子或超过一个孩子,那么返回值为 None
  • 如果此 tag 有一个子标签,则返回值是递归的子标签的“字符串”属性。

text

  • 获取所有子字符串并返回使用给定分隔符连接起来的字符串。

如果 html 是这样的:

 <td>some text</td>
<td></td>
<td><p>more text</p></td>
<td>even <p>more text</p></td>

.string 在四个 td 将返回,

 some text
None
more text
None

.text 会给出这样的结果,

 some text

more text
even more text

原文由 salmanwahed 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果一个标签包含不止一个东西,那么不清楚 .string 应该指代什么,所以 .string 被定义为 None:

例子:

 <td>sometext<p>sometext</p></td>

如果出现以下情况,上面的代码将返回 NoneType: td.string 已完成,因为 td 包含文本以及另一个 p 标签。但是 td.text 会给出:sometextsometext

原文由 Raju Thapa EverestBlogger 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题