.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
。但是,这为第二个 <td>
标记提取了 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
Codeforces Round #604 (Div. 2) A. Beautiful String
6.4 VJ E - K-th Beautiful String