------------只要够努力,人生最坏的结局不过是大器晚成!!!

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

   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>,<\td>

代码如下:

# -*- 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('=============================')

  

 

posted on 2018-11-20 22:18  ystraw  阅读(2662)  评论(0编辑  收藏  举报

不经一番切孤寒,怎得梅花扑鼻香