前提・実現したいこと
rubyにて情報提供系サイトにてpdfやWordファイルがいくつ存在しているか(添付されているか)を調査するため、
seleniumにて簡易クローラー作成しようとしています。
発生している問題・エラーメッセージ
掲載パターンが3パターンありif文で分岐させています。
①記事内にpdfやWordが複数あるバージョン(xpath指定)
/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[*]/dt/a
②記事内にpdfやWordが単品のバージョン(xpath指定)
html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl/dt/a
③記事内に添付ファイルがない
該当のソースコード
ruby
1newsUrl.each do |url| 2 driver.navigate.to(url) 3 puts "#{url}に移動します" 4 sleep 1 5 fileCount = fileCount + 1 6 begin 7 while true do 8 if driver.find_element(:xpath, '/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[*]/dt/a') 9 file = driver.find_element(:xpath, "/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[#{fileCount}]/dt/a") 10 fileHref = news.attribute('href') 11 filePaths << fileHref 12 elsif driver.find_element(:xpath, '/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl/dt/a') 13 file = driver.find_element(:xpath, "/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl/dt/a") 14 fileHref = news.attribute('href') 15 filePaths << fileHref 16 else 17 puts "#{url}のファイルは空です。" 18 end 19 end 20 rescue Selenium::WebDriver::Error::NoSuchElementError 21 puts "url無し" 22 end 23end 24
試したこと
上記のようにif文で書き実行してみたのですが
下記のようなエラーが出ます。
他の方法ご存知の方いたら教えてほしいです。
ruby
1./demo.rb:103:in `block in <main>': undefined method `+' for nil:NilClass (NoMethodError)
./demo.rb:103
は具体的には、どこを指すのでしょうか?
fileCount = fileCount + 1
の事でしょうか?
ご回答ありがとうございます。
おっしゃるとおり、./demo.rbの:103行目が```./demo.rb:103:in```となります
fileCount の定義はどうなっているのでしょうか?
attr_reader :fileCount
とか
attr_accessor :fileCount
の様になっているのでしょうか?
もう一点。
fileCount は newsUrl のインデックスとか通し番号の認識で合っていますでしょうか?
fileCountは
```fileCount = fileCount + 1```として、index代わりに使用していまして、
attr_accessor :fileCount
のようには使用していません。
他の処理にて```index = index + 1```を使用しているため、
indexの代わりとなる変数名を「fileCount」として使用しています。
①記事内にpdfやWordが複数あるバージョン(xpath指定)
```/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[*]/dt/a```
>いくつのファイルが添付されているかは不明
②記事内にpdfやWordが単品のバージョン(xpath指定)
>添付されているファイルは1点のみ
```html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl/dt/a```
③記事内に添付ファイルがない
newsUrlのとび先では、上記3種の掲載パターンがあります。
newsUrlのすべてのURLを巡回し、添付されているファイルURLの取得と、添付されているファイルの総数を知りたいです。
newsUrlは現在調査しているサイトの記事すべてのURLが入っていて、それに添付されているファイルと、そのファイルのURLを抜き出したいと思っています。
いろいろと後追いでの情報提供ですみません...
> 記事内にpdfやWordが複数あるバージョン(xpath指定)
ある URL に /html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[*]/dt/a で一致する要素が複数個あるということでしょうか?
はいそうです。
複数のファイルが紐づく記事は下記のような指定で、すべてのファイルの情報を取得したいです。
/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[#{fileCount}]/dt/a
1 つめの添付ファイル
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl/dt/a"
2 つめの添付ファイル
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl1/dt/a"
3 つめの添付ファイル
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl2/dt/a"
という事でしょうか?
おっしゃる通りです。
下記のようにすると取得できます。
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[1]/dt/a"
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[2]/dt/a"
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[3]/dt/a"
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[1]/dt/a"
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[2]/dt/a"
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[3]/dt/a"
この例は、添付ファイルが3つある場合ということでしょうか?
添付ファイルが2つの場合は、
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[1]/dt/a"
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[2]/dt/a"
で取得できて、1つの場合は、
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl/dt/a"
で取得できるということでしょうか?
添付ファイルの個数と、期待される xpath の一覧の対応がわかると、ありがたいです。
その通りです!
そのパターンに加え、添付ファイルのない記事もあります。
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl[*]/dt/a"
"/html/body/div[3]/div[1]/div[2]/div[2]/div[2]/div/dl/dt/a"
上記のようなxpathが存在しないページが添付のない記事です
回答3件
あなたの回答
tips
プレビュー