- 帖子
- 109
- 主題
- 1
- 精華
- 0
- 積分
- 116
- 點名
- 0
- 作業系統
- win7
- 軟體版本
- 2007
- 閱讀權限
- 20
- 註冊時間
- 2016-8-4
- 最後登錄
- 2018-10-22
 
|
68#
發表於 2016-9-11 10:38
| 只看該作者
本帖最後由 zyzzyva 於 2016-9-11 10:41 編輯
因為最後希望能輸出到csv(準備使用csv module的dictwriter,以key:value的方式寫入),所以要先把資料處理好。
試著直接把資料印出來
好像還可以。那試著把資料放到list裡看看
還真是醜,應該是因為全部的資料都在同一個td裡,中間又有空白、換行,實在不知道從何處理起。
換個方式先把字串取出來,順便把空白去掉,看起來好多了,是我能夠處理的資料了。
(這樣要多一個list,感覺有點繞路,應該有更好的處理方式,不過暫時沒想出來,先能work再說)
因為最後希望得到的是[ {dic1},{dic2},{'建檔 ID':'811223', '分類':'教育訓練' ,...}, {dic4}....]的格式,所以還有一些問題:
1、'回報資料錯誤 ' 不是我們要的,
2、'電郵'、'網址'等有中斷,實際資料跑到list的下一個元素去了。(其實還有宗派、母會,每個教會的資料有些許不同)
先準備幾個資料:一個空的字典(dictionary)、2個空的串列(list),這個要在function外面。
myDict = {}
myList = []
tmpList = []- def get_detail(url, s):
- print(url)
- res = s.get(url)
- res.encoding = 'utf-8'
- soup = BeautifulSoup(res.text, 'lxml')
- detail = soup.find_all('td', 'church_detail')
- for ddd in detail[0].stripped_strings:
- if '回報資料錯誤 >' in ddd:
- #如果字串是 '回報資料錯誤 >',不動作,直接進入下一次迴圈
- continue
- else:
- tmpList.append(ddd) #其他的都放進tmpList裡
- for i, s in enumerate(tmpList):
- if s == "":
- #如果是空字串,不動作,直接進入下一次迴圈
- continue
- elif any(x in s for x in ['電郵', '網址', '宗派', '母會']):
- #如果是'電郵', '網址', '宗派', '母會'其中之一,將其去除':'後做為key值,tmpList的下一個元素做為value,新增至myDict
- myDict[s.replace(':', '')] = tmpList[i+1]
- else:
- try:
- myDict[s.split(':')[0]] = s.split(':')[1]
- #其他的以':'分割,前部做為key值,後部做為value,新增至myDict
- except:
- #如果有例外,跳過不處理
- pass
- #將myDict整個放到myList裡
- myList.append(myDict)
複製代碼 這樣get_detail應該就差不多完成了,下午有空再來測試一下。 |
|