免费注册 查看新帖 |

Chinaunix

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

请教各位大侠一个关于beautifulsoup的奇怪的问题 [复制链接]

求职 : 系统工程师等
论坛徽章:
5
技术图书徽章
日期:2014-04-19 22:01:05天蝎座
日期:2014-05-09 13:49:28双子座
日期:2014-06-16 15:08:042015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:28
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-31 18:28 |只看该作者 |倒序浏览
      1、我把一个网页保存为html,然后用beautifulsoup去分析。
      结果发现,通过封装的函数buildSoupFromStr(content)调用会报错,
      直接使用BeautifulSoup(content,fromEncoding="GBK")则不会。

      2、另外,请教各位大侠,如果抓取一个网页的文本部分,除了正则、beautifulsoup、还有比较好的办法吗?
       感觉beautifulsoup也不太方便。

  
报错内容如下:
  1. Traceback (most recent call last):
  2.   File "C:\Program Files\Python27\code\hanhan.py", line 29, in <module>
  3.     buildSoupFromStr(content)
  4.   File "C:\Program Files\Python27\code\hanhan.py", line 20, in buildSoupFromStr
  5.     soup = BeautifulSoup(content,fromEncoding)
  6.   File "build\bdist.win32\egg\BeautifulSoup.py", line 1522, in __init__
  7.     BeautifulStoneSoup.__init__(self, *args, **kwargs)
  8.   File "build\bdist.win32\egg\BeautifulSoup.py", line 1147, in __init__
  9.     self._feed(isHTML=isHTML)
  10.   File "build\bdist.win32\egg\BeautifulSoup.py", line 1189, in _feed
  11.     SGMLParser.feed(self, markup)
  12.   File "C:\Program Files\Python27\lib\sgmllib.py", line 104, in feed
  13.     self.goahead(0)
  14.   File "C:\Program Files\Python27\lib\sgmllib.py", line 174, in goahead
  15.     k = self.parse_declaration(i)
  16.   File "build\bdist.win32\egg\BeautifulSoup.py", line 1463, in parse_declaration
  17.     j = SGMLParser.parse_declaration(self, i)
  18.   File "C:\Program Files\Python27\lib\markupbase.py", line 109, in parse_declaration
  19.     self.handle_decl(data)
  20.   File "build\bdist.win32\egg\BeautifulSoup.py", line 1448, in handle_decl
  21.     self._toStringSubclass(data, Declaration)
  22.   File "build\bdist.win32\egg\BeautifulSoup.py", line 1379, in _toStringSubclass
  23.     self.endData()
  24.   File "build\bdist.win32\egg\BeautifulSoup.py", line 1251, in endData
  25.     (not self.parseOnlyThese.text or \
  26. AttributeError: 'str' object has no attribute 'text'
复制代码
全部代码如下:
  1. # -*- coding: cp936 -*-
  2. from sys import *
  3. from BeautifulSoup import *


  4. def getContent(filename):
  5.     try:
  6.         file_object = open(filename, 'r')
  7.     except IOError:  
  8.         print 'Can not find file'
  9.         return -1
  10.     try:
  11.         content = file_object.read( )
  12.     finally:
  13.         file_object.close( )
  14.     return content

  15. def buildSoupFromStr(content,fromEncoding="GBK"):
  16.     print type(content)
  17.     soup = BeautifulSoup(content,fromEncoding)
  18.     #return soup

  19.    
  20. if __name__ == '__main__':
  21.     content = getContent('han.html')
  22.     #print content
  23.     if -1 == content:
  24.         print 'error happen'
  25.     buildSoupFromStr(content)
  26.     #BeautifulSoup(content,fromEncoding="GBK")
  27.    

复制代码

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2014-05-31 19:31 |只看该作者
1.bs默认是UTF-8,如果真实页面是其它编码(ASCII除外),就会报错。在参数设置事先知道的编码方式。
2. bs支持多种API,比如CSS selector就比较方便,前提是要了解CSS selector的语法。总体来看,HTML/XML结构化文档的解析工作都是比较繁琐复杂,没什么捷径。

求职 : 系统工程师等
论坛徽章:
5
技术图书徽章
日期:2014-04-19 22:01:05天蝎座
日期:2014-05-09 13:49:28双子座
日期:2014-06-16 15:08:042015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:28
3 [报告]
发表于 2014-05-31 20:33 |只看该作者
timespace 发表于 2014-05-31 19:31
1.bs默认是UTF-8,如果真实页面是其它编码(ASCII除外),就会报错。在参数设置事先知道的编码方式。
2. b ...


谢谢大侠!
关于1,我直接调用没有报错,但是我将参数传递进去之后就报错了!不是很奇怪的事情嘛!
貌似跟编码方式无关吧!

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
4 [报告]
发表于 2014-05-31 21:12 |只看该作者
回复 3# qxhgd
是说调用方式啊,确实和编码无关。知道怎么用positional参数和keyword参数吗?改buildSoupFromStr:
  1. soup = BeautifulSoup(content,fromEncoding= fromEncoding)
复制代码

求职 : 系统工程师等
论坛徽章:
5
技术图书徽章
日期:2014-04-19 22:01:05天蝎座
日期:2014-05-09 13:49:28双子座
日期:2014-06-16 15:08:042015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:28
5 [报告]
发表于 2014-06-01 11:28 |只看该作者
回复 4# timespace

按照你的修改的确正常了,多谢了!

但是我做了个测试:

  1. def func2(a,b):
  2.     print 'a is ',a,',b is',b

  3. def func1(a,b=5):
  4.     func2(a,b)

  5. func1(3,4)
复制代码
最终打印结果:
a is  3 ,b is 4


没有报错呢!

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
6 [报告]
发表于 2014-06-01 11:48 |只看该作者
为什么要报错?bs的encoding需要keyword参数,你传了positional参数,导致bs的内部逻辑错误,但不是语法错误。

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
7 [报告]
发表于 2014-06-04 11:23 |只看该作者
用lxml模块,然后用xpath语法析出你要的数据。

求职 : 系统工程师等
论坛徽章:
5
技术图书徽章
日期:2014-04-19 22:01:05天蝎座
日期:2014-05-09 13:49:28双子座
日期:2014-06-16 15:08:042015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:28
8 [报告]
发表于 2014-06-04 15:15 |只看该作者
回复 7# r2007

谢谢大神,有空试试!

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP