.string 和 .text BeautifulSoup 之间的区别

Posted

技术标签:

【中文标题】.string 和 .text BeautifulSoup 之间的区别【英文标题】:Difference between .string and .text BeautifulSoup 【发布时间】:2014-10-09 06:20:42 【问题描述】:

我在使用 BeautifulSoup 时发现了一些奇怪的地方,但找不到任何支持这一点的文档,所以我想在这里询问。

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

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

official documented 提取数据的方式是soup.string。但是,这为第二个 &lt;td&gt; 标记提取了 NoneType。所以我尝试了soup.text(因为为什么不呢?)它完全按照我的意愿提取了一个空字符串。

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

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

【问题讨论】:

【参考方案1】:

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

从documentation 来看,NavigableString 就像 Python 中的 Unicode 字符串,只是它还支持 Navigating the tree 和 Searching the tree 中描述的一些功能。

.string上的documentation可以看出,如果html是这样的,

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

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

为了更方便,

string

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

【讨论】:

我想知道为什么文档中没有提到.text...【参考方案2】:

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

示例:

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

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

【讨论】:

【参考方案3】:

元素

<td></td>

是否包含空字符串。相当于

<td/>

没有孩子。对于 XML,“无文本”和“零长度文本”是一样的。

所以soup.string 返回NoneType 是正确的。

另见How to create an XML text node with an empty string value (in Java)

【讨论】:

所以换句话说,.string 反映了 html,因为空标签中没有字符串。而.text 反映了在空字符串中实际看到的内容?如果过于简化,请致歉。

以上是关于.string 和 .text BeautifulSoup 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Hihocoder1061-Beautiful String

hiho一下:Beautiful String

Codeforces Round #604 (Div. 2) A. Beautiful String

6.4 VJ E - K-th Beautiful String

6.4 VJ E - K-th Beautiful String

Codeforces Round #604 (Div. 2) A. Beautiful String(贪心)