Re: [問題] 關於網頁抓取內容

看板Python作者 (←這人是超級笨蛋)時間9年前 (2014/09/01 23:25), 編輯推噓3(3020)
留言23則, 5人參與, 最新討論串1/4 (看更多)
※ 引述《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
我測試後知道問題是在他把有TAG的地方分開了
09/01 23:34, 3F

09/01 23:34, , 4F
但好像也是在函式內做的,所以似乎無從下手
09/01 23:34, 4F

09/01 23:35, , 5F
本來想說試試看能不能紀錄說每個start到end之間有幾筆
09/01 23:35, 5F

09/01 23:35, , 6F
再把這幾筆合併在一起,但這只是想法啦 沒做出來 ..
09/01 23:35, 6F

09/01 23:36, , 7F
而我會用2版是上網查了一些教學說推薦用2版的 ..
09/01 23:36, 7F

09/01 23:36, , 8F
看來我應該學3版的 .. 我會重新研究看看的 謝謝你
09/01 23:36, 8F

09/01 23:37, , 9F
我不太了解的是 他是start跑完才跑end ?
09/01 23:37, 9F

09/01 23:38, , 10F
還是跑一次start跑一次end 重複下去?
09/01 23:38, 10F

09/01 23:38, , 11F
我想說程式是從上面執行到下面 所以是start完才end
09/01 23:38, 11F

09/01 23:39, , 12F
不過對於這些函式的運作原理一頭霧水 ..
09/01 23:39, 12F

09/02 00:19, , 13F
想請問一下 安裝BeautifulSoup後一直無法import
09/02 00:19, 13F

09/02 00:19, , 14F
出現File "C:\Python34\bs4\__init__.py", line 175
09/02 00:19, 14F

09/02 00:19, , 15F
except Exception, e: 是哪邊出了問題嗎?
09/02 00:19, 15F

09/02 00:20, , 16F
痾 ... 又莫名奇妙可以了
09/02 00:20, 16F

09/02 09:59, , 17F
import bs4 不行嗎?
09/02 09:59, 17F

09/02 16:23, , 18F
原本不行 整個砍掉重灌3版就可以了 不過request裝失敗
09/02 16:23, 18F

09/02 17:50, , 19F
是 requests 吧
09/02 17:50, 19F

09/02 19:42, , 20F
是requests沒錯 是出現同樣一個問題
09/02 19:42, 20F

09/03 09:22, , 21F
我還是純字串爬比較實在
09/03 09:22, 21F

09/03 11:09, , 22F
你有 requests 安裝失敗的完整錯誤訊息嗎?我在 win OK
09/03 11:09, 22F

09/03 11:13, , 23F
另外是 BeautifulSoup4 喔,我在 win8.1 py3.4 都成功
09/03 11:13, 23F
文章代碼(AID): #1K18_wni (Python)
文章代碼(AID): #1K18_wni (Python)