beautifulSoup4とSeleniumを用いて単語帳を作成したい。
beautifulSoup4とSeleniumでWebページから要素を取得し、その要素をリストに格納する。その際、同一ページから取得した複数の要素を一つの要素としてリストに格納したい。
単語帳のイメージとしては、同じ行にキーワード、その説明、その関連語と並べたいです。
発生している問題
上図のように同色で網掛けしてあるセルが同一ページから取得した要素です。複数の要素としてリストに格納すると、上図のように複数セルに出力されてしまい、title語とずれてしまいます。
該当のソースコード
Python
1#! python3.8 2 3import urllib.request,urllib.error 4import bs4 5import openpyxl 6from selenium import webdriver 7from time import sleep 8from openpyxl.styles import Alignment 9 10 11#Webページに遷移 12print('GooGling...') 13driver = webdriver.Firefox(executable_path='/Users/katsuhisaoikawa/opt/anaconda3/bin/geckodriver') 14url = 'http://ssd.cswiki.jp/index.php?%E6%AD%B4%E5%8F%B2%EF%BC%A1%E3%83%A9%E3%83%B3%E3%82%AF' 15driver.get(url) 16sleep(5) 17 18#ページ内のキーワードを示すHTMLを取得 19soup1 = bs4.BeautifulSoup(driver.page_source, 'html.parser') 20titles = [] 21for title in soup1.select('p a'): 22 titles.append(title.getText()) 23titles.remove('歴史キーワード') 24 25#キーワードの説明のページに遷移しHTMLを取得 26##キーワードのリンクのURLを取得 27explain_urls = [] 28elems_explain_url = driver.find_elements_by_css_selector('#body p a') 29for elem_explain_url in elems_explain_url: 30 explain_url = elem_explain_url.get_attribute('href') 31 explain_urls.append(explain_url) 32explain_urls.remove('http://ssd.cswiki.jp/index.php?%E6%AD%B4%E5%8F%B2%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89') 33##取得したリンクに遷移し、そのページのHTMLを取得 34explanations = [] 35related_terms = [] 36for explain_url_list in explain_urls: 37 driver.get(explain_url_list) 38 sleep(10) 39 soup2 = bs4.BeautifulSoup(driver.page_source, 'html.parser') 40 soup3 = bs4.BeautifulSoup(driver.page_source, 'html.parser') 41 for explanation in soup2.select('#body p'): 42 explanations.append(explanation.getText()) 43 for related_term in soup3.select('#body a'): 44 related_terms.append(related_term.getText()) 45 driver.back() 46 47new_explanations1 = [e for e in explanations if '歴史' not in e] 48new_explanations2 = [f for f in new_explanations1 if '【' not in f] 49new_related_terms1 = [s for s in related_terms if '歴史' not in s] 50new_related_terms2 = [t for t in new_related_terms1 if '地理' not in t] 51new_related_terms3 = [u for u in new_related_terms2 if '公民' not in u] 52new_related_terms4 = [v for v in new_related_terms3 if '†' not in v] 53# --- ここからスクレイピング結果を出力するコード --- 54 55# 既に用意しているファイルを開く 56wb = openpyxl.Workbook() 57 58# # 既に用意したファイルがなければ新規ワークブックを作成 59# wb = openpyxl.Workbook() 60 61sheet = wb.active 62sheet.title = 'A_rank' # ついでに「シート名」を変更 63 64# 「タイトル行」を入力(事前に入力していない場合) 65sheet["A1"].value = 'title' 66sheet["B1"].value = 'explaination' 67sheet["C1"].value = 'related_term' 68 69# フォントの設定 70 71#セルの設定 72 73# A2からC6まで順に出力 74n = len(titles) 75m = len(new_explanations2) 76l = len(new_related_terms4) 77 78for i in range(1,n): 79 sheet.cell(column = 1, row = i+1, value = titles[i-1]) 80for i in range(1,m): 81 sheet.cell(column = 2, row = i+1, value = new_explanations2[i-1]) 82for i in range(1,l): 83 sheet.cell(column = 3, row = i+1, value = new_related_terms4[i-1]) 84 85# 保存して閉じる 86wb.save('keyword_ver0.94.xlsx') 87wb.close() 88
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/10 12:28