我注意到在使用BeautifulSoup时有些奇怪,但找不到任何文档来支持这一点,所以我想在这里问一下。
假设我们有一个像我们用BS解析过的标签:
<td>Some Table Data</td>
<td></td>
official documented提取数据的方式是soup.string
。但是,这为第二个<td>
标记提取了NoneType。所以我尝试soup.text
(因为为什么不呢?)并且它完全按照我想要的方式提取了一个空字符串。
但是我在文档中找不到任何对此的引用,我担心某些事情是错过的。任何人都可以告诉我这是否可以使用,或者以后会引起问题?
BTW我正在从网页上抓取表数据并且意味着从数据创建CSV,所以我确实需要空字符串而不是NoneTypes。
答案 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)