zoukankan      html  css  js  c++  java
  • bs4 string与text的区别

    例子:

    soup=BeautifulSoup(r.text,"html.parser")
    print soup.div.find('div',id="site_nav_top").text

    print  soup.div.find('div',id="site_nav_top").string

    用python写爬虫时,BeautifulSoup真是解析html,快速获取所需数据的神器。

    这个美味汤使唤起来,屡试不爽。

    在用find()方法找到特定的tag后,想获取里面的文本,可以用.text属性或者.string属性。

    在很多时候,两者的返回结果一致,但其实两者是有区别的。

    .string的资料很多,.text的资料比较少。

    遍寻中文世界没有满意的答案,直接google在stock overflow中找到了很满意的解答:

    .string on a Tag type object returns a NavigableString type object. On the other hand, .textgets all the child strings and return concatenated using the given separator. Return type of .text is unicode object.

    From the documentation, A NavigableString is just like a Python Unicode string, except that it also supports some of the features described in Navigating the tree and Searching the tree.

    From the documentation on .string, we can see that, If the html is like this,

    1.  
      <td>Some Table Data</td>
    2.  
      <td></td>

    Then, .string on the second td will return None. But .text will return and empty string which is a unicode type object.

    For more convenience,

    string
    
    • Convenience property of a tag to get the single string within this tag.
    • If the tag has a single string child then the return value is that string.
    • If the tag has no children or more than one child the return value is None
    • If this tag has one child tag return value is the 'string' attribute of the child tag, recursively.

    And text

    • Get all the child strings and return concatenated using the given separator.

    If the html is like this:

    1.  
      1、<td>some text</td>
    2.  
      2、<td></td>
    3.  
      3 、<td><p>more text</p></td>
    4.  
      4、<td>even <p>more text</p></td>
    5.  
       

    .string on the four td will return,

    1.  
      1、some text
    2.  
      2、None
    3.  
      3、more text
    4.  
      4、None

    .text will give result like this

    1.  
      1、some text
    2.  
       
    3.  
      2、more text
    4.  
      3、even more text

    通过以上的举例,可以很清楚的发现,.find和.string之间的差异:

    第一行,在指定标签td,没有子标签,且有文本时,两者的返回结果一致,都是文本

    第二行,在指定标签td,没有子标签,且没有文本时,.string返回None,.text返回为空

    第三行,在指定标签td,只有一个子标签时,且文本只出现在子标签之间时,两者返回结果一致,都返回子标签内的文本

    第四行,最关键的区别,在指定标签td,有子标签,并且父标签td和子标签p各自包含一段文本时,两者的返回结果,存在很大的差异

    .string返回为空,因为文本数>=2,string不知道获取哪一个

    .text返回的是,两段文本的拼接。

  • 相关阅读:
    安装VMware16兼容Hyper-v+WSL2+Docker+解决0x80370102报错
    家用联通光纤开启IPv6
    配置微软Azure大数据HDInsight云集群
    Hadoop集群搭建-05安装配置YARN
    Hadoop集群搭建-04安装配置HDFS
    Hadoop集群搭建-03编译安装hadoop
    Hadoop集群搭建-02安装配置Zookeeper
    Hadoop集群搭建-01前期准备
    springMVC+request.session实现用户登录和访问权限控制
    idea+spring4+springmvc+mybatis+maven实现简单增删改查CRUD
  • 原文地址:https://www.cnblogs.com/kaibindirver/p/11374669.html
Copyright © 2011-2022 走看看