.string和.text BeautifulSoup之间的区别

时间:2014-08-15 13:54:05

标签: python beautifulsoup

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

假设我们有一个像我们用BS解析过的标签:

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

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

但是我在文档中找不到任何对此的引用,我担心某些事情是错过的。任何人都可以告诉我这是否可以使用,或者以后会引起问题?

BTW我正在从网页上抓取表数据并且意味着从数据创建CSV,所以我确实需要空字符串而不是NoneTypes。

3 个答案:

答案 0 :(得分:45)

.string类型对象上的

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

documentation开始,A NavigableString就像Python Unicode字符串一样,除了它还支持Navigating the tree和{{3}中描述的一些功能}。

.string <td>Some Table Data</td> <td></td> 开始,我们可以看到,如果html是这样的,

.string

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

为了更方便,

tag
  • tag的便捷属性,用于获取此标记内的单个字符串。
  • 如果tag有一个字符串子项,则返回值为该字符串。
  • 如果None没有子女或多个孩子,则返回值为tag
  • 如果此text有一个子标记,则返回值是子标记的'string'属性,递归。

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 会给出这样的结果,

{{1}}

答案 1 :(得分:4)

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

示例:

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

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

答案 2 :(得分:0)

元素

<td></td>

包含空字符串。它相当于

<td/>

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

因此soup.string返回NoneType是正确的。

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