找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 4622|回复: 3

[已回复] 如何使用BeautifulSoup读取网站数据?

2

主题

6

帖子

6

积分

贫民

积分
6
aukuno 发表于 2017-2-6 18:40:32 | 显示全部楼层 |阅读模式
问题描述:我尝试用BeautifulSoup读取如下表格(去掉了表头)的数据:
  1. <blockquote><tbody id="cqssc_draw_list_tbody">
复制代码
代码:代码里只用了BeautifulSoup的contents方法(鄙人小白),和上面的
  1. #读取表格里面每一条td记录
  2. soup = BeautifulSoup(doc,'lxml')
  3. td = soup.find_all('td')
  4. #新建列表
  5. itemList = []

  6. #for循环尝试抽取每条td记录中的id,开奖号,十位,个位,后三

  7. #for循环
  8. for each_line in td:
  9.    try:
  10.     #id
  11.     idNumber = each_line.contents[0].contents[0]

  12.     #开奖号
  13.     lotteryNumber = each_line.contents[1].contents[0].contents[0].split(" ")

  14.     #十位
  15.     tens = each_line.contents[1].contents[1].contents[0].contents[0] + td[0].contents[1].contents[1].contents[1]

  16.     #个位
  17.     units = each_line.contents[1].contents[2].contents[0] + td[0].contents[1].contents[2].contents[1].contents[0]

  18.     #后三
  19.     lastThree = each_line.contents[1].contents[3].contents[0]

  20.     #每条td记录构成一个列表
  21.     item = [idNumber, lotteryNumber, tens, units, lastThree]

  22.     #全体td构成的列表
  23.     itemList.append(item)
  24.    except ValueError:
  25.        pass
  26. print itemList[4]
复制代码



输出:
  1. Traceback (most recent call last):
  2.   File "C:/Users/Administrator/PycharmProjects/shishicai/tbodyShishicai.py", line 16, in <module>
  3.     tens = each_line.contents[1].contents[1].contents[0].contents[0] + td[0].contents[1].contents[1].contents[1]
  4.   File "C:\Users\Administrator\Anaconda2\lib\site-packages\bs4\element.py", line 713, in __getattr__
  5.     self.__class__.__name__, attr))
  6. AttributeError: 'NavigableString' object has no attribute 'contents'

  7. Process finished with exit code 1
复制代码

错误描述:
我的代码里面使用的contents方法实际上是暴力地遍历html树的每条td记录,但是记录的NavigableString可操作字符串和tag标签相对位置不一样,所以for循环有时候取得到tag标签的contents,有时候取得是NavigableString的contents,但是NavigableString没有contents成员,所以报错了。


求解决:我就是想知道能怎么把这个表格里的所以数据都抽取出来,最后形成一个矩阵,(如下所示)先谢谢各位版主,各位大神!

预期的矩阵数据

预期的矩阵数据











回复

使用道具 举报

2

主题

6

帖子

6

积分

贫民

积分
6
aukuno  楼主| 发表于 2017-2-6 18:44:59 | 显示全部楼层
本帖最后由 aukuno 于 2017-2-6 18:49 编辑

原先帖子不知道为什么不能显示我的表格数据,各位大神请看下方
  1. <tbody id="cqssc_draw_list_tbody">
  2.   <tr>
  3.     <td>
  4.       <span class="text1">
  5.         001
  6.       </span>
  7.       <span id="draw_td_001">
  8.         <span class="text2 red_big">
  9.           3 5 9 5 4
  10.         </span>
  11.         <span class="text1">
  12.           <span class="orange">
  13.             大
  14.           </span>
  15.           单
  16.         </span>
  17.         <span class="text1">
  18.           小
  19.           <span class="orange">
  20.             双
  21.           </span>
  22.         </span>
  23.         <span class="text1">
  24.           组六
  25.         </span>
  26.       </span>
  27.     </td>
  28.     <td>
  29.       <span class="text1">
  30.         041
  31.       </span>
  32.       <span id="draw_td_041">
  33.         <span class="text2 red_big">
  34.           0 8 2 0 7
  35.         </span>
  36.         <span class="text1">
  37.           小
  38.           <span class="orange">
  39.             双
  40.           </span>
  41.         </span>
  42.         <span class="text1">
  43.           <span class="orange">
  44.             大
  45.           </span>
  46.           单
  47.         </span>
  48.         <span class="text1">
  49.           组六
  50.         </span>
  51.       </span>
  52.     </td>
  53.     <td>
  54.       <span class="text1">
  55.         081
  56.       </span>
  57.       <span id="draw_td_081">
  58.       </span>
  59.     </td>
  60.   </tr>
  61. </tbody>
复制代码

回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2017-2-7 16:41:45 | 显示全部楼层
可以尝试先找到所有的tr标签内容,然后遍历,结合find_next_sibling()进行查找
具体可参考bs4文档:http://docs.pythontab.com/beautifulsoup4/
回复 支持 反对

使用道具 举报

2

主题

6

帖子

6

积分

贫民

积分
6
aukuno  楼主| 发表于 2017-2-8 11:33:43 | 显示全部楼层
blueelwang 发表于 2017-2-7 16:41
可以尝试先找到所有的tr标签内容,然后遍历,结合find_next_sibling()进行查找
具体可参考bs4文档:http:// ...

谢谢谢谢!
然后我还有一个问题你能帮我吗?
下面的表格是网站上的数据,表格数据包裹在<tbody>标签当中(实际上就是这个帖子的那段代码)
无标题.png
我用BeautifulSoup的时候代码如下:
  1. # -*- coding: utf-8 -*-
  2. import urllib2
  3. from bs4 import BeautifulSoup

  4. url = 'http://baidu.lecai.com/lottery/draw/sorts/cqssc.php?agentId=5591'
  5. web = urllib2.urlopen(url)
  6. content = web.read()

  7. soup = BeautifulSoup(web, 'html.parser')
  8. td = soup.find_all('td')
  9. print td
复制代码
结果打印来td为空,我尝试将soup打印出来,代码和显示如下:
代码:
  1. tbody = soup.find('tbody')
  2. print tbody
复制代码
显示:
  1. C:/Users/Administrator/PycharmProjects/shishicai/shishicai.py
  2. <tbody id="cqssc_draw_list_tbody">
  3. </tbody>

  4. Process finished with exit code 0
复制代码
似乎是BeautifulSoup对于解析树的层级有限制,你能帮我解决这个问题吗?

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表