[问题] BS无法辨认之前已出现过的的中文字。

楼主: ansem (DoubleA)   2016-07-07 14:07:23
小弟我在网页抓资料时发现假如出现过的文字,再次出现时似乎无法被辨认。
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
还是我的程式码本身就有问题?
还请各位赐教。
作者: s860134 (s860134)   2016-07-07 19:13:00
tds index写死?
楼主: ansem (DoubleA)   2016-07-07 22:57:00
写死的意思是??
作者: s860134 (s860134)   2016-07-08 08:04:00
我误解了,实际跑下去应该是网页中 tag 判断有问题把 'lxml' parser 换成 'html.parser' 会好一点但是 DOM 的结构感觉还是和预想的有差距print(sp.find_all('table')[1]) 看一下尾端内容原本的 parser 爬得并不完整程式码中的 sp 就已经没抓到 "净利(损)归属于:"后的所有 <tr> tag 所以你在抓的时候抓不到可能 bs 本身有问题,直接拿 lxml.etree 来做是可以的https://goo.gl/fGJCYt 这是改写过的版本
楼主: ansem (DoubleA)   2016-07-08 11:40:00
其实当初我也发现BS似乎没有抓到,但是以为发现的规则是有出现过的字无法重复判定,有点像是搜寻时假如重复出现两个相同字串时就会让BS无法读取,总之感谢大大囉。
作者: buganini (霸格尼尼)   2016-07-12 14:01:00
把lxml换成html5lib 容错能力会好一点

Links booklink

Contact Us: admin [ a t ] ucptt.com