Re: [问题] 关于网页抓取内容

楼主: uranusjr (←這人是超級笨蛋)   2014-09-01 23:25:34
※ 引述《jenocool ()》之铭言:
: class Title(SGMLParser):
: name=[]
: def handle_data(self, text):
: if self.is_a and text !='库存页面' and text !='更多此站结果':
: self.name.append(text)
: for i in List.name:
: print i.decode('utf-8')
看得出来你和 Python 很不熟
不过身为一个写 C++ 赚饭钱的人
我必须要先说你变量命名成这样即使 C++ 也是不及格...
Anyway
常见的 markup language parser 基本上分两种
Python 2 内建的 SGMLParser 属于 SAX parser
这种 parser 是会把资料逐步读进来, 当发生事情的时候就通知你
所以举例而言, 当 SGMLParser 遇到 <a href="/">Foo<b>Bar</b>Baz</a>
会触发的事件与传入的参数依序会是
事件函式 attrs text
=========================================
start_a href => '/'
handle_data Foo
start_b
handle_data Bar
end_b
handle_data Baz
end_a
看懂了吗?handle_data 是在每次遇到非 tag 资料时就输出
其输出的内容不是 tag pair (start 和 end) 里面包住的东西
而是该 tag 直到下一个 tag (不论是否成对) 之间的内容
所以不是有 nested tag 会让输出换行
而是你的程式根本就把它们视为独立的项目了
当你用 for 循环把它们印出时就会一行一行分开, 因为 print 会自动加换行
那要怎么修呢?我的建议是砍掉重练
最主要的原因是 SGMLParser 根本连官方都早已不推荐使用
如果你一定要使用 SAX parser, 至少应该用 HTMLParser
https://docs.python.org/2.7/library/htmlparser.html
不过就你的输入内容而言, 反正你是要爬整个页面
那么比较好的选择其实是改用 DOM parser
这种 parser 是会把整个资料读进来解析, 重组成完整的资料结构给你
在使用上会简单很多(因为你不需要自己维护状态)
Python 内建的 XML/HTML DOM parser 叫做 ElementTree
https://docs.python.org/2/library/xml.etree.elementtree.html
但是这个拿来爬 malformed HTML 容易出包
所以一般建议用第三方套件
我个人喜欢 lxml, 不过看起来你是在 Windows 上 (直觉), 应该不容易装
所以还是试试前面有人推的 BeautifulSoup 好了
有文件有范例的, 而且还有中文, 应该可以自己看吧
http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
什么?你连怎么装都不知道?什么 easy_install 什么 pip 都说找不到指令?
谁叫你要用 Python 2 呢, 请你改用 Python 3.4 吧
作者: jenocool   2014-09-01 23:33:00
谢谢你的回应 其实我程式码大部份是参考网络的所以连变量名称都没有改变 ..我测试后知道问题是在他把有TAG的地方分开了但好像也是在函式内做的,所以似乎无从下手本来想说试试看能不能纪录说每个start到end之间有几笔再把这几笔合并在一起,但这只是想法啦 没做出来 ..而我会用2版是上网查了一些教学说推荐用2版的 ..看来我应该学3版的 .. 我会重新研究看看的 谢谢你我不太了解的是 他是start跑完才跑end ?还是跑一次start跑一次end 重复下去?我想说程式是从上面执行到下面 所以是start完才end不过对于这些函式的运作原理一头雾水 ..想请问一下 安装BeautifulSoup后一直无法import出现File "C:\Python34\bs4\__init__.py", line 175except Exception, e: 是哪边出了问题吗?疴 ... 又莫名奇妙可以了
作者: z101924512   2014-09-02 09:59:00
import bs4 不行吗?
作者: jenocool   2014-09-02 16:23:00
原本不行 整个砍掉重灌3版就可以了 不过request装失败
楼主: uranusjr (←這人是超級笨蛋)   2014-09-02 17:50:00
是 requests 吧
作者: jenocool   2014-09-02 19:42:00
是requests没错 是出现同样一个问题
作者: swpoker (swpoker)   2014-09-03 09:22:00
我还是纯字串爬比较实在
作者: ccwang002 (亮)   2014-09-03 11:09:00
你有 requests 安装失败的完整错误讯息吗?我在 win OK另外是 BeautifulSoup4 喔,我在 win8.1 py3.4 都成功

Links booklink

Contact Us: admin [ a t ] ucptt.com