質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

411閲覧

Ruby 配列の数の差によってメソッドがNoMethodErrorになってしまう。

amedama

総合スコア37

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/06/25 07:51

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くらいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これってelseなので

ruby

1else match = post.attribute("innerHTML").match(/正規表現パターン2/) 2 csv << match[1..2] 3end

ブロックをわかりやすく整理するとこうなりますが

ruby

1else 2 match = post.attribute("innerHTML").match(/正規表現パターン2/) 3 csv << match[1..2] 4end

やりたいのはこれじゃないですか?

ruby

1elsif match = post.attribute("innerHTML").match(/正規表現パターン2/) 2 csv << match[1..2] 3end

投稿2020/06/25 07:59

編集2020/06/25 08:04
ozwk

総合スコア13532

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amedama

2020/06/25 08:10

ご指摘ありがとうございます。 elsifの間違いに加えて、正規表現でキャッチできていない投稿があるようです。 訂正してみます。ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問