SeleniumでHTMLファイルを取得し、HTMLを解析するスクリプトを書いています。
投稿一覧のエレメントを取得し、各投稿のリンクやタイトル、本文などを投稿の形式に沿って正規表現で抽出し、CSVに保存する。
といった処理です。
合計1000件くらいの投稿数なのですが、一気に配列を回すと
Ruby
1csv = CSV.open("test.csv",'w') 2posts = driver.find_elements(:xpath, "//div[@class='post_list']") 3 4posts.each do |post| ←postsは1000件程度 5 if match = post.attribute("innerHTML").match(/正規表現パターン1/) 6 csv << match[1..2] 7 else match = post.attribute("innerHTML").match(/正規表現パターン2/) 8 csv << match[1..2] 9 end 10end 11 12csv.close
Ruby
1NoMethodError (undefined method `[]' for nil:NilClass)
と出てしまいます。
postsに渡す数を十件程度にすると期待通りに情報を取得してくれます。
Ruby
1csv = CSV.open("test.csv",'w') 2posts = driver.find_elements(:xpath, "//div[@class='post_list']") 3 4 posts[0..10].each do |post| 5 if match = post.attribute("innerHTML").match(/正規表現/) 6 csv << match[1..2] 7 else match = post.attribute("innerHTML").match(/正規表現/) 8 csv << match[1..2] 9 end 10 end 11csv.close
しかしpostsを数十件に増やすと同じくNoMehodErrorと出てしまいます。
バッチ処理とfind_elementを使用するなどで工夫すればもう少し大きい数でも扱えました。
posts[0..150].each_slice(50) do |batch| batch.each do |post| csv << [ post.find_element(:css, "title").attribute("alt"), post.find_element(:css, "span").text, post.find_element(:css, "a").attribute("href") ] end end
もう少しバッチ処理を駆使して冗長な書き方を模索すれば一応の目的の動作は達成できそうですが、なぜそうなっているかを把握したいです。
どなたかご教授よろしくお願いします。
以下、使えそうな情報を記載します。
PCのスペックは
MacBook Air
CPU: 1.6 GHz デュアルコアIntel Core i5
メモリ:16 GB です。
HTMLのファイルサイズは3MBくらいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/25 08:10