作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] 关於网页抓取内容
时间Mon Sep 1 23:25:34 2014
※ 引述《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 吧
--
╱ ̄ ̄ ̄╲
▏
◢█◣ ▏
︻█︻█ ▏
成龙表示: 是喔...
′/ ‵ ▏
╰╯ █╱
ψQSWEET ◥︶█◤
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.161.94.175
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1409585146.A.C6C.html
1F:推 jenocool: 谢谢你的回应 其实我程式码大部份是参考网路的 09/01 23:33
2F:→ jenocool: 所以连变数名称都没有改变 .. 09/01 23:33
3F:→ jenocool: 我测试後知道问题是在他把有TAG的地方分开了 09/01 23:34
4F:→ jenocool: 但好像也是在函式内做的,所以似乎无从下手 09/01 23:34
5F:→ jenocool: 本来想说试试看能不能纪录说每个start到end之间有几笔 09/01 23:35
6F:→ jenocool: 再把这几笔合并在一起,但这只是想法啦 没做出来 .. 09/01 23:35
7F:→ jenocool: 而我会用2版是上网查了一些教学说推荐用2版的 .. 09/01 23:36
8F:→ jenocool: 看来我应该学3版的 .. 我会重新研究看看的 谢谢你 09/01 23:36
9F:→ jenocool: 我不太了解的是 他是start跑完才跑end ? 09/01 23:37
10F:→ jenocool: 还是跑一次start跑一次end 重复下去? 09/01 23:38
11F:→ jenocool: 我想说程式是从上面执行到下面 所以是start完才end 09/01 23:38
12F:→ jenocool: 不过对於这些函式的运作原理一头雾水 .. 09/01 23:39
13F:→ jenocool: 想请问一下 安装BeautifulSoup後一直无法import 09/02 00:19
14F:→ jenocool: 出现File "C:\Python34\bs4\__init__.py", line 175 09/02 00:19
15F:→ jenocool: except Exception, e: 是哪边出了问题吗? 09/02 00:19
16F:→ jenocool: 痾 ... 又莫名奇妙可以了 09/02 00:20
17F:推 z101924512: import bs4 不行吗? 09/02 09:59
18F:推 jenocool: 原本不行 整个砍掉重灌3版就可以了 不过request装失败 09/02 16:23
19F:→ uranusjr: 是 requests 吧 09/02 17:50
20F:→ jenocool: 是requests没错 是出现同样一个问题 09/02 19:42
21F:→ swpoker: 我还是纯字串爬比较实在 09/03 09:22
22F:→ ccwang002: 你有 requests 安装失败的完整错误讯息吗?我在 win OK 09/03 11:09
23F:→ ccwang002: 另外是 BeautifulSoup4 喔,我在 win8.1 py3.4 都成功 09/03 11:13