免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6127 | 回复: 10
打印 上一主题 下一主题

html表格型数据用bs或者re模块怎么分析出(提取)对应的值的超链接 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-06 15:48 |只看该作者 |倒序浏览
本帖最后由 prints 于 2014-03-06 15:49 编辑

aspx的网页里面的表格数据,分析不出来,请各位路过的前辈,兄弟们多多帮忙啊。
我一天要打开许多次这个网页:http://www.porttrade.net/workinfo/PrintMD.aspx
我们要关注载有某种货物的船是否到了,如果这个网页上出现了,要知道它的中文船名,点最左边的船名可以进去看详细的内容,一天下来很是烦人,学python现在还是属于新手级的,许多地方的基本功都不扎实。看了源码在交互模式下搞了半天没有办法实现。
想法是用BeautifulSoup或正则表达式来取出对应的值,在这里只关心货物里面的“铁矿砂”,如果有就取出它的中文船名,然后获得链接地址获得里面的“备注”信息。
在此先谢过了!{:3_192:}

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-03-06 16:39 |只看该作者
回复 1# prints

第一步, 取到整个 url的 html txt
第二步, 把所有的"回车"全去掉
第三步, 以<tr> </tr> 重新加上回车.
第四步, 找到你要的行 "铁矿砂", 顺便就解析出了你要的船名.



   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
3 [报告]
发表于 2014-03-06 16:57 |只看该作者
不是都有想法了吗?一步一步做,遇到具体问题再发问。

论坛徽章:
0
4 [报告]
发表于 2014-03-06 17:14 |只看该作者
本帖最后由 prints 于 2014-03-06 17:14 编辑

回复 3# timespace


    搞了一下午没搞成功,不是一步一步来,第一步就没想出办法。用bs模块和re都没想出办法来。

论坛徽章:
0
5 [报告]
发表于 2014-03-07 09:52 |只看该作者
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import urllib2,urlparse
  4. from bs4 import BeautifulSoup

  5. def TrItemList(tr):
  6.     ' 根据一个TR对象,返回一个对应表格行的各列列表字符串 '
  7.     lst = []
  8.     for td in tr.find_all('td'):
  9.         lst.append(td.string.strip() if td.string else '')
  10.     return lst
  11.    
  12. def OpenUrl(url):
  13.     try:
  14.         opener = urllib2.urlopen(url)
  15.         return opener.read()
  16.     except Exception as e:
  17.         print(str(e)) #自己处理异常信息吧
  18.         return ''
  19.    
  20. def Main():
  21.     url = 'http://www.porttrade.net/workinfo/PrintMD.aspx'
  22.     page = OpenUrl(url)
  23.     if not page:
  24.         return
  25.     page = page.decode('gbk')
  26.     soup = BeautifulSoup(page)
  27.     tab = soup.find('table', id='DataGrid2')
  28.     if tab:
  29.         for tr in tab.find_all('tr'):
  30.             if u'铁矿砂' in TrItemList(tr)[5]:
  31.                 td = tr.find('td')
  32.                 a = td.find('a')
  33.                 if a:
  34.                     shipname = a.string.strip()
  35.                     shipurl = urlparse.urljoin(url,a['href'])
  36.                     #TODO
  37.                     #船舶URL已经在这里了,剩下的就由你来做练习吧
  38.                     print('SHIP(%s) URL:%s'%(shipname,shipurl))
  39.     else:
  40.         print('Not have table!')
  41.         
  42. if __name__ == '__main__':
  43.     Main()
复制代码

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
6 [报告]
发表于 2014-03-07 11:27 |只看该作者
已有楼上热心朋友提供的Python2版本了,我顺路提供个Python3的。
  1. from bs4 import BeautifulSoup
  2. from urllib.request import Request, urlopen

  3. user_agent = \
  4.         'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) '\
  5.         'AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 '\
  6.         'Safari/537.73.11'

  7. def get_doc(url):
  8.     req = Request(url, headers={'User-Agent': user_agent})
  9.     return BeautifulSoup(urlopen(req).read().decode('GB18030'))

  10. def main():
  11.     doc = get_doc('http://www.porttrade.net/workinfo/PrintMD.aspx')
  12.     for tr in doc.select('table#DataGrid2 > tr'):
  13.         td = tr.select('td:nth-of-type(8)')
  14.         if not td or td[0].string.find('铁矿砂') == -1: continue
  15.         td = tr.select('td:nth-of-type(1) > a')
  16.         if not td: continue

  17.         name = td[0].string.strip()
  18.         url = 'http://www.porttrade.net/workinfo/' + td[0]['href']
  19.         tr_doc = get_doc(url)
  20.         td = tr_doc.select('span#txtbz')
  21.         if td:
  22.             note = td[0].string.strip() if td[0].string else 'None'
  23.             print('船名:{}\n备注:{}\n网址:{}\n'.format(name, note, url))

  24. if __name__ == '__main__':
  25.     main()
复制代码
执行输出:
  1. (py3) bash-3.2 $python --version
  2. Python 3.3.4
  3. (py3) bash-3.2 $python bs.py
  4. 船名:敬业6
  5. 备注:货备新苏港
  6. 网址:http://www.porttrade.net/workinfo/SASP.aspx?id=343989

  7. 船名:长禄海
  8. 备注:货备新苏港。
  9. 网址:http://www.porttrade.net/workinfo/SASP.aspx?id=344094

  10. 船名:浙海161
  11. 备注:None
  12. 网址:http://www.porttrade.net/workinfo/SASP.aspx?id=344096

  13. 船名:金海鲲
  14. 备注:None
  15. 网址:http://www.porttrade.net/workinfo/SASP.aspx?id=344184

  16. 船名:陆海顺
  17. 备注:None
  18. 网址:http://www.porttrade.net/workinfo/SASP.aspx?id=344199
复制代码
注:
1. 全面的异常检查,我就懒得做了。
2. 尽量加上与本地浏览器一致的User-Agent。
3. Python 3的源文件编码默认是UTF-8
如果经常抓网页数据,了解WEB基础是必须的,这不是一两个下午能搞定的,做好长期战斗准备。

论坛徽章:
0
7 [报告]
发表于 2014-03-07 14:22 |只看该作者
回复 5# cdhigh


    真心非常感谢,我得好好研究一番。

论坛徽章:
0
8 [报告]
发表于 2014-03-07 14:23 |只看该作者
本帖最后由 prints 于 2014-03-07 16:42 编辑

回复 6# timespace


    也非常感谢你,看样子我还是得多积累,非常感谢你的热心!
    就是输出的结果都是按装货名称,没有卸货名称的。

论坛徽章:
0
9 [报告]
发表于 2014-03-09 10:04 |只看该作者
本帖最后由 prints 于 2014-03-09 10:21 编辑

@timespace你的代码的main()里的内容没有看懂,能不能给个注解啊?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
10 [报告]
发表于 2014-03-09 10:21 |只看该作者
本帖最后由 timespace 于 2014-03-09 10:27 编辑

回复 9# prints
这里取的是第八列“装货名称”,你可以在这基础上随便改。细节就是两部分内容,其一要看bs4文档的select函数,其二就是了解CSS selector语法


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP