免费注册 查看新帖 |

Chinaunix

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

请帮忙看看这段提取网页链接的代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-04 17:15 |只看该作者 |倒序浏览
先上代码,再说问题。
  1. # -*- coding: utf-8 -*-
  2. from sgmllib import SGMLParser
  3. class ListName(SGMLParser):
  4.     is_data = False
  5.     urls = []
  6. #    def __init__(self, text):
  7. #        self.text = text

  8.     def handle_data(self, text):
  9.         if text == 'Google.com in English':
  10.             self.is_data = True

  11.     def start_a(self, attrs):
  12.         if self.is_data:
  13.             href = [ v for k, v in attrs if k == 'href']
  14.             if href:
  15.                 self.urls.extend(href)
  16.         self.is_a = True
  17.     def end_a(self):
  18.         self.is_a = False

  19. import urllib
  20. url = 'http://www.google.com.hk'
  21. page = urllib.urlopen(url).read()

  22. #x = ListName('Google.com in English')
  23. x = ListName()
  24. #print 'x.text',x.text
  25. x.feed(page)
  26. print x.urls
复制代码
第一个问题:我的意图是,当handle_data发现内容是“Google.com in English”的时候,就提取对应的url,这里设置了一个标志,is_data。
可是实际运行的时候,我发现,提取出来的url,不是对应“Google.com in English”的超链接,而是下一个超链接,这是什么原因?

第二个问题:我想比较中文,比如我写成:        if text == '翻译':  这样,就匹配不了了,看来应该是编码问题,应该怎么处理?

第三个问题:我想传入一个参数,用来对比,即提取特定文字对应的url,可是我发现似乎不能定义__init__方法?这是为什么?

论坛徽章:
0
2 [报告]
发表于 2010-06-04 17:55 |只看该作者
第一个问题:我的意图是,当handle_data发现内容是“Google.com in English”的时候,就提取对应的url,这里设置了一个标志,is_data。

因该是

  1. if 'Google.com in English' in text:
  2.     pass
复制代码
第二个问题:我想比较中文,比如我写成:        if text == '翻译':  这样,就匹配不了了,看来应该是编码问题,应该怎么处理?

这应该就是编码问题,你的程序文件是什么编码?在==时两边的编码应该一致。

第三个问题:我想传入一个参数,用来对比,即提取特定文字对应的url,可是我发现似乎不能定义__init__方法?这是为什么?

这个你还是写一个工具函数:

  1. def getUrl(self, myurl):
  2.     for url,name in self.urls:
  3.         if url == myurl:
  4.             return name
  5.     return ''
  6.             
复制代码
我假设你的self.url里面是存储的[(url1,name1),(url2,name2)],比较的时候编码也要一致

论坛徽章:
0
3 [报告]
发表于 2010-06-04 21:21 |只看该作者
本帖最后由 luffy.deng 于 2010-06-04 21:31 编辑

回复 1# chinaunix874

你没有搞清楚数据处理的过程。要先添加url然后用 handle_data判断本次添加的url是否符合要求,不符的予以删除。
关于中文比较应该没什么问题。
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. from sgmllib import SGMLParser
  4. import urllib
  5. class ListName(SGMLParser):
  6.     def __init__(self,v_arg=''):
  7.         self.is_data = False
  8.         self.urls = []
  9.         self.arg=v_arg
  10.         SGMLParser.__init__(self)
  11.     def handle_data(self, text):
  12.         if not self.is_data:
  13.             return
  14.         if text != self.arg:
  15.             self.urls.pop()
  16.         self.is_data=False
  17.     def start_a(self, attrs):
  18.         for k, v in attrs:
  19.             if k == 'href':
  20.                 self.urls.append(v)
  21.                 self.is_data=True
  22.                 break
  23. url = 'http://www.google.com.hk'
  24. page = urllib.urlopen(url).read()
  25. x = ListName('Google.com in English')
  26. x.feed(page)
  27. print x.urls
复制代码
输出:
['http://www.google.com/ncr']
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP