BeautifulSoup中select的使用方法

html = """
  <html><head><title>The Dormouse's story</title></head>
  <body>
  <p class="title" name="dromouse"><b>The Dormouse's story</b></p>
  <p class="story">Once upon a time there were three little sisters; and their names were
  <a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
  <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
  <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
  and they lived at the bottom of a well.</p>
 <p class="story">...</p>
 """

我们在写 CSS 时,标签名不加任何修饰,类名(class="className"引号内即为类名)前加点,id名(id="idName"引号前即为id名)前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list
(1)通过标签名查找
 

print soup.select('title') 
#[<title>The Dormouse's story</title>]

print soup.select(‘a’)
#[<a class=“sister” href=“http://example.com/elsie” id=“link1”><!-- Elsie --></a>, <a class=“sister” href=“http://example.com/lacie” id=“link2”>Lacie</a>, <a class=“sister” href=“http://example.com/tillie” id=“link3”>Tillie</a>]

print soup.select(‘b’)
#[<b>The Dormouse’s story</b>]

(2)通过类名查找
 

print soup.select('.sister')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

(3)通过 id 名查找
 

print soup.select('#link1')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

(4)组合查找

组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开
 

print soup.select('p #link1')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

直接子标签查找
 

print soup.select("head > title")
#[<title>The Dormouse's story</title>]

(5)属性查找

查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。
 

print soup.select("head > title")
#[<title>The Dormouse's story</title>]

print soup.select(‘a[href=“http://example.com/elsie”]’)
#[<a class=“sister” href=“http://example.com/elsie” id=“link1”><!-- Elsie --></a>]

同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格
 

print soup.select('p a[href="http://example.com/elsie"]')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
 
 

 

BeautifulSoup支持CSS选择器是令人惊喜的,这大大方便了我们对特定标签的选取。那么接下来就来试验一下。 
比如现在我们需要选取搜狗主页中导航栏中导向“知乎”的链接。 
分析文档结构大概有这几个比较容易区分的层级特点:


  
  
  1. <div class="top-nav">
  2. <ul>
  3. ...
  4. <li class="cur"> <span>网页 </span> </li>
  5. href="http://zhihu.sogou.com/" uigs-id="nav_zhihu" id="zhihu">知乎 </a> </li>
  6. <li> <a onclick="st(this,'40030500','pic')" href="http://pic.sogou.com" uigs-id="nav_pic" id="pic">图片 </a> </li>
  7. ...
  8. </ul>
  9. </div>

      鉴于如此的结构,我们可以使用类选择器选择“.top-nav”然后使用后代选择其选择“ul”标签和“li”标签,于是整个选择器可以写为“.top-nav ul li”,在代码中实现如下:

      
        
        
      1. li = bs.select( '.top-nav ul li')
      2. print( "result len is", len(li))
      3. for tag in li:
      4. print(tag)

          得到如下输出:

          
            
            
          1. result len is 10
          2. <li> <a href="http://news.sogou.com" id="news" onclick="st(this,'40030300','news')" uigs-id="nav_news">新闻 </a> </li>
          3. <li class="cur"> <span>网页 </span> </li>
          4. <li> <a href="http://weixin.sogou.com/" id="weixinch" onclick="st(this,'73141200','weixin')" uigs-id="nav_weixin">微信 </a> </li>
          5. <li> <a href="http://zhihu.sogou.com/" id="zhihu" onclick="st(this,'40051200','zhihu')" uigs-id="nav_zhihu">知乎 </a> </li>
          6. <li> <a href="http://pic.sogou.com" id="pic" onclick="st(this,'40030500','pic')" uigs-id="nav_pic">图片 </a> </li>
          7. ...

              但里面出现了“网页”这个没有链接到其他地址的项,要如何将之过滤掉呢。可以结合filter函数进行处理,如下:

              
                
                
              1. def hasHttpLink(tag):
              2. """此时的tag为<li>标签,需要取得其中的<a>再来进行判断"""
              3. return tag.a is not None and tag.a.get( 'href').startswith( "http")
              4. for tag in filter(hasHttpLink, li):
              5. print(tag)

                  结果中已经过滤掉“网页”这项了:

                  
                    
                    
                  1. <li> <a href="http://news.sogou.com" id="news" onclick="st(this,'40030300','news')" uigs-id="nav_news">新闻 </a> </li>
                  2. <li> <a href="http://weixin.sogou.com/" id="weixinch" onclick="st(this,'73141200','weixin')" uigs-id="nav_weixin">微信 </a> </li>
                  3. <li> <a href="http://zhihu.sogou.com/" id="zhihu" onclick="st(this,'40051200','zhihu')" uigs-id="nav_zhihu">知乎 </a> </li>
                  4. <li> <a href="http://pic.sogou.com" id="pic" onclick="st(this,'40030500','pic')" uigs-id="nav_pic">图片 </a> </li>
                  5. ...

                      其中filter高阶函数进行过滤时还可以使用正则来进行匹配筛选。 
                      不过一般情况下仅仅使用selector就能比较精确的获取结果集了,因此filter也不用写得很复杂。


                      猜你喜欢

                      转载自blog.csdn.net/ITYTI/article/details/83385278