看板 Python 關於我們 聯絡資訊
小弟我在網頁抓資料時發現假如出現過的文字,再次出現時似乎無法被辨認。 import urllib from bs4 import BeautifulSoup #url ='http://mops.twse.com.tw/mops/web/ajax_t164sb04?encodeURIComponent=1&step=1&firstin=1&off=1&keyword4=&code1=&TYPEK2=&checkbtn=&queryName=co_id&TYPEK=all&isnew=false&co_id=2330&year=102&season=01' url='http://mops.twse.com.tw/server-java/t164sb01?step=1&CO_ID=2330&SYEAR=2013&SSEASON=1&REPORT_ID=C' response = urllib.urlopen(url) html= response.read() sp = BeautifulSoup(html,"lxml") #cp950 trs=sp.find_all('tr',attrs={'class':["odd","even"]}) for tr in trs: #只要前面的字有重複就會認不出來 tds=tr.find_all('td') for td in tds: if (td.get_text().strip().encode('utf8')=="營業收入合計"): if (tds[1].get_text().strip()!=''): print('Earning','102','1',tds[1].get_text().strip().encode('utf8')) print('Earning','102','1',tds[2].get_text().strip().encode('utf8')) if (td.get_text().strip().encode('utf8')=="基本每股盈餘合計"): if (tds[1].get_text().strip()!=''): print('EPS','102','1',tds[1].get_text().strip().encode('utf8')) print('EPS','102','1',tds[2].get_text().strip().encode('utf8')) 程式在抓取第一個營業收入合計時完全沒有問題,而在抓取基本每股盈餘時就完全沒反應 而由於之前已經有出現過"基本每股盈餘"這個字串(不過少了合計),請問這部分是程式的Bug 還是我的程式碼本身就有問題? 還請各位賜教。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.205.229 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1467871646.A.402.html
s860134: tds index寫死? 07/07 19:13
ansem: 寫死的意思是?? 07/07 22:57
s860134: 我誤解了,實際跑下去應該是網頁中 tag 判斷有問題 07/08 08:04
s860134: 把 'lxml' parser 換成 'html.parser' 會好一點 07/08 08:05
s860134: 但是 DOM 的結構感覺還是和預想的有差距 07/08 08:06
s860134: print(sp.find_all('table')[1]) 看一下尾端內容 07/08 08:07
s860134: 原本的 parser 爬得並不完整 07/08 08:07
s860134: 程式碼中的 sp 就已經沒抓到 "淨利(損)歸屬於:"後的 07/08 10:08
s860134: 所有 <tr> tag 所以你在抓的時候抓不到 07/08 10:09
s860134: 可能 bs 本身有問題,直接拿 lxml.etree 來做是可以的 07/08 10:27
s860134: https://goo.gl/fGJCYt 這是改寫過的版本 07/08 10:28
ansem: 其實當初我也發現BS似乎沒有抓到,但是以為發現的規則是有 07/08 11:40
ansem: 出現過的字無法重複判定,有點像是搜尋時假如重複出現兩個 07/08 11:41
ansem: 相同字串時就會讓BS無法讀取,總之感謝大大囉。 07/08 11:42
buganini: 把lxml換成html5lib 容錯能力會好一點 07/12 14:01