質問編集履歴
1
回答いただいて修正したものを追加しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -269,3 +269,203 @@
|
|
269
269
|
python 2.7
|
270
270
|
|
271
271
|
windows10
|
272
|
+
|
273
|
+
|
274
|
+
|
275
|
+
######回答をいただいた後にseleniumを使って作った修正版
|
276
|
+
|
277
|
+
KUROROさんに作っていただいたものとは別に自分でも作っていたので、対比として載せておきます。作っていただいたものと並べて見ることで、「こんな方法があるのか」「こう書けばすっきりするのか」ととても勉強になりましたので、自分と同じくらいのレベルであがいている人の役には立つのではないかと考えました。
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
```python
|
282
|
+
|
283
|
+
#coding:cp932
|
284
|
+
|
285
|
+
|
286
|
+
|
287
|
+
import time
|
288
|
+
|
289
|
+
from selenium import webdriver
|
290
|
+
|
291
|
+
import chromedriver_binary
|
292
|
+
|
293
|
+
from bs4 import BeautifulSoup
|
294
|
+
|
295
|
+
import csv
|
296
|
+
|
297
|
+
import codecs
|
298
|
+
|
299
|
+
import os
|
300
|
+
|
301
|
+
|
302
|
+
|
303
|
+
#グローバル変数
|
304
|
+
|
305
|
+
#サイトURL
|
306
|
+
|
307
|
+
url='http://medinf.mmic.or.jp/' #トップページ
|
308
|
+
|
309
|
+
|
310
|
+
|
311
|
+
#抽出する市区町村
|
312
|
+
|
313
|
+
chiiki="青葉区"
|
314
|
+
|
315
|
+
|
316
|
+
|
317
|
+
#保存場所
|
318
|
+
|
319
|
+
#fpath='デスクトップパス'
|
320
|
+
|
321
|
+
fpath=os.path.expanduser('~/Desktop')
|
322
|
+
|
323
|
+
|
324
|
+
|
325
|
+
def main():
|
326
|
+
|
327
|
+
## try:
|
328
|
+
|
329
|
+
#市区町村コードげと
|
330
|
+
|
331
|
+
c=area_select(chiiki)
|
332
|
+
|
333
|
+
|
334
|
+
|
335
|
+
driver=webdriver.Chrome()
|
336
|
+
|
337
|
+
driver.get(url)
|
338
|
+
|
339
|
+
time.sleep(1)
|
340
|
+
|
341
|
+
|
342
|
+
|
343
|
+
#この辺はdriver.find〜by_なんとか().clickと書いて良いのを知りませんでした…
|
344
|
+
|
345
|
+
#検索ページに移動
|
346
|
+
|
347
|
+
kensakuP=driver.find_element_by_link_text(u"診療科目と所在地")
|
348
|
+
|
349
|
+
kensakuP.click()
|
350
|
+
|
351
|
+
|
352
|
+
|
353
|
+
#内科
|
354
|
+
|
355
|
+
naika=driver.find_element_by_name("chkbox1[0]")
|
356
|
+
|
357
|
+
naika.click()
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
#小児科
|
362
|
+
|
363
|
+
shounika=driver.find_element_by_name("chkbox1[6]")
|
364
|
+
|
365
|
+
shounika.click()
|
366
|
+
|
367
|
+
|
368
|
+
|
369
|
+
#地域
|
370
|
+
|
371
|
+
area=driver.find_element_by_name(c)
|
372
|
+
|
373
|
+
area.click()
|
374
|
+
|
375
|
+
|
376
|
+
|
377
|
+
#検索ボタン
|
378
|
+
|
379
|
+
kensakuB=driver.find_element_by_xpath("/html/body/div/table[2]/tbody/tr[8]/td/input[1]")
|
380
|
+
|
381
|
+
kensakuB.click()
|
382
|
+
|
383
|
+
|
384
|
+
|
385
|
+
#次の25件が出なくなるまで繰り返し
|
386
|
+
|
387
|
+
while True:
|
388
|
+
|
389
|
+
#driver.find_elements(By.TAG_NAME, "tbody")で取得すればよいのがわからなかったので前回のを使っています
|
390
|
+
|
391
|
+
#そのせいで各ページの表の見出しが繰り返し取得されてしまっています(要修正部分)
|
392
|
+
|
393
|
+
source=driver.page_source
|
394
|
+
|
395
|
+
soup=BeautifulSoup(source,"html.parser")
|
396
|
+
|
397
|
+
|
398
|
+
|
399
|
+
table2csv(soup)
|
400
|
+
|
401
|
+
|
402
|
+
|
403
|
+
#次へトライ
|
404
|
+
|
405
|
+
try:
|
406
|
+
|
407
|
+
nextgo=driver.find_element_by_xpath("/html/body/div/table[3]/tbody/tr/td[3]/input[1]")
|
408
|
+
|
409
|
+
nextgo.click()
|
410
|
+
|
411
|
+
time.sleep(3)
|
412
|
+
|
413
|
+
except Exception:
|
414
|
+
|
415
|
+
break
|
416
|
+
|
417
|
+
finally:
|
418
|
+
|
419
|
+
driver.quit
|
420
|
+
|
421
|
+
|
422
|
+
|
423
|
+
#直せないから置換する
|
424
|
+
|
425
|
+
with open(fpath+"/"+chiiki+".csv") as file:
|
426
|
+
|
427
|
+
data_lines=file.read()
|
428
|
+
|
429
|
+
|
430
|
+
|
431
|
+
data_lines = data_lines.replace('\n', '')
|
432
|
+
|
433
|
+
data_lines = data_lines.replace('",,', '",')
|
434
|
+
|
435
|
+
|
436
|
+
|
437
|
+
with open(fpath+"/"+chiiki+".csv","w") as f:
|
438
|
+
|
439
|
+
f.write(data_lines)
|
440
|
+
|
441
|
+
def area_select(chiiki):
|
442
|
+
|
443
|
+
areas={
|
444
|
+
|
445
|
+
#値をリストではなく文字列に変更
|
446
|
+
|
447
|
+
"青葉区":"chkbox100[0]",
|
448
|
+
|
449
|
+
#省略
|
450
|
+
|
451
|
+
}
|
452
|
+
|
453
|
+
#地域コード返す
|
454
|
+
|
455
|
+
idx=areas[chiiki]
|
456
|
+
|
457
|
+
return idx
|
458
|
+
|
459
|
+
|
460
|
+
|
461
|
+
def table2csv(soup):
|
462
|
+
|
463
|
+
#テーブル
|
464
|
+
|
465
|
+
table=soup.findAll("table",{"class":""})[3]#.prettify('shift-jis')
|
466
|
+
|
467
|
+
#省略
|
468
|
+
|
469
|
+
#if "script" in cell.name:の条件分岐部分をまとめて削除
|
470
|
+
|
471
|
+
```
|