【问题标题】:Difference between .string and .text BeautifulSoup.string 和 .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。

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

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

    documentation 来看,NavigableString 就像 Python 中的 Unicode 字符串,只是它还支持 Navigating the treeSearching 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 反映了在空字符串中实际看到的内容?如果过于简化,请致歉。
      猜你喜欢
      • 1970-01-01
      • 2012-03-18
      • 2013-08-13
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 2013-06-25
      相关资源
      最近更新 更多