Re: [問題] 關於網頁抓取內容
※ 引述《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://www.ptt.cc/bbs/Python/M.1409585146.A.C6C.html
推
09/01 23:33, , 1F
09/01 23:33, 1F
→
09/01 23:33, , 2F
09/01 23:33, 2F
→
09/01 23:34, , 3F
09/01 23:34, 3F
→
09/01 23:34, , 4F
09/01 23:34, 4F
→
09/01 23:35, , 5F
09/01 23:35, 5F
→
09/01 23:35, , 6F
09/01 23:35, 6F
→
09/01 23:36, , 7F
09/01 23:36, 7F
→
09/01 23:36, , 8F
09/01 23:36, 8F
→
09/01 23:37, , 9F
09/01 23:37, 9F
→
09/01 23:38, , 10F
09/01 23:38, 10F
→
09/01 23:38, , 11F
09/01 23:38, 11F
→
09/01 23:39, , 12F
09/01 23:39, 12F
→
09/02 00:19, , 13F
09/02 00:19, 13F
→
09/02 00:19, , 14F
09/02 00:19, 14F
→
09/02 00:19, , 15F
09/02 00:19, 15F
→
09/02 00:20, , 16F
09/02 00:20, 16F
推
09/02 09:59, , 17F
09/02 09:59, 17F
推
09/02 16:23, , 18F
09/02 16:23, 18F
→
09/02 17:50, , 19F
09/02 17:50, 19F
→
09/02 19:42, , 20F
09/02 19:42, 20F
→
09/03 09:22, , 21F
09/03 09:22, 21F
→
09/03 11:09, , 22F
09/03 11:09, 22F
→
09/03 11:13, , 23F
09/03 11:13, 23F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 4 篇):
問題
3
23