zoukankan      html  css  js  c++  java
  • 37-python中bs4获取的标签中如何提取子标签

    如果只是要提取一个标签 里面的属性值啥的,直接看这篇文章就可以了:

       23-python用BeautifulSoup用抓取a标签内所有数据

    如果是标签的嵌套,可以参考下面的思路,虽然不是很简洁,但是可以解决你的问题:

    可以看到不能直接 findAll 所有的 tr 标签,否则会有许多杂质的, 所以,可以知道 table, 根据id 或者class, 则可以唯一找到;

    下面的重点就是如何分析出我们想要的数据,如何提取出 每个 tr 包含的一行数据呢?

    我的思路是:

    findALL---table  => 得到一个list只包含一个table,也就是我要的table

    将这个table 在用一次 findall 然后:

    findAll --- tr   ==> 得到一个list,  包含每一个<tr>....</tr>;  好,我们已经得到我们要的每一行数据了

    如何提取每一个数据呢:两种方法:

    第一种是 考虑遍历每个<tr>, 利用findALL函数找 td, 读取td的string 

    第二种是考虑遍历每个<tr>, 利用findALL函数找到每个td, 用replace 替换掉 <td>,< d>

    代码如下:

    # -*- coding:utf-8 -*-
    # python 2.7
    # XiaoDeng
    # http://tieba.baidu.com/p/2460150866
    # 标签操作
    
    
    from bs4 import BeautifulSoup
    import urllib.request
    import re
    
    # 如果是网址,可以用这个办法来读取网页
    # html_doc = "http://tieba.baidu.com/p/2460150866"
    # req = urllib.request.Request(html_doc)
    # webpage = urllib.request.urlopen(req)
    # html = webpage.read()
    
    
    
    html = """
    <table class="GridViewStyle" cellspacing="0" rules="all" border="1" id="ctl00_MainContentPlaceHolder_GridScore">
    		<caption>
    			(共49条/1页)
    		</caption>
    		<tr class="HeaderStyle">
    			<th scope="col">学年</th><th scope="col">学期</th><th scope="col">课程名称</th><th scope="col">课程学分</th><th scope="col">考试类型</th><th scope="col">考试成绩</th><th scope="col">所获学分</th><th scope="col">考试成绩3</th>
    		</tr>
    		<tr>
    			<td>2016</td><td>3</td><td>高等数学Ⅰ(一)</td><td>5.5</td><td>正常</td><td>67</td><td>5.5</td><td>107356</td>
    		</tr>
    		<tr>
    			<td>2017</td><td>1</td><td>高等数学Ⅰ(二)</td><td>5.5</td><td>正常</td><td>65</td><td>5.5</td><td>111481</td>
    		</tr>
    	</table>
    </div>
    """
    bs = BeautifulSoup(html, 'lxml')
    score = bs.findAll('table', attrs={"id": 'ctl00_MainContentPlaceHolder_GridScore'})
    bs2 = score[0]  #提取出唯一一项,注意它依然是'lxml'格式,不需要重新beautifulSoup,注意它不是字符串!!!
    score = bs2.findAll('tr') #找到每一个行
    for i in score:
        rt = i.findAll('td')  #找到每一列
        # print(rt)
        if len(rt) == 0:
            continue
        ## 一种方法:
        for j in rt:
            # print('j: ', j)
            sj = str(j)
            sj = sj.replace("<td>", '')
            sj = sj.replace('</td>', '')
            print(sj)
        ## 另一种方法:
        for j in rt:
            print(j.string)
        print('=============================')
    

      

  • 相关阅读:
    《VR入门系列教程》之21---使用Unity开发GearVR应用
    《VR入门系列教程》之20---使用Oculus移动端SDK
    《VR入门系列教程》之19---GearVR开发初识
    《VR入门系列教程》之18---Oculus代码剖析
    《VR入门系列教程》之17---发布第一个应用
    《VR入门系列教程》之16---第一个OculusVR应用
    阿里巴巴开发手册提取信息
    国富论
    富通天下(W 笔试)
    富通天下(T 面试)
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/9992105.html
Copyright © 2011-2022 走看看