質問編集履歴

1

回答いただいて修正したものを追加しました

2021/05/21 13:05

投稿

pia
pia

スコア14

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
+ ```