2017-07-29 11 views
0

公開されているWebサイトからRのデータフレームにHTMLテーブルを読み込もうとしています。テーブルの最後の列にはハイパーリンクが含まれています。 Webページに表示されるテキストではなく、テーブルにハイパーリンクされます。私はStackOverflowや他のサイトでいくつかの記事を見直してきましたが、ほとんどそこにいましたが、私はハイパーリンク自体を読むことができませんでした。ハイパーリンクを含むデータフレームへのHTMLテーブルの読み込みR

私が読んでいるテーブルはここにあります:http://mis.ercot.com/misapp/GetReports.do?reportTypeId=12300&reportTitle=LMPs%20by%20Resource%20Nodes,%20Load%20Zones%20and%20Trading%20Hubs&showHTMLView=&mimicKey

最後の列には、ダウンロード用の* .ZIPファイル形式の実際のデータを指すハイパーリンクが含まれています。私はテーブルをRにテキストとして読み込むことに成功しましたが、最終列のハイパーリンクを解決する方法を理解することはできません。ここで

は、私がこれまで持っているものです。

library(XML) 
webURL <- 'http://mis.ercot.com/misapp/GetReports.do?reportTypeId=12300&reportTitle=LMPs%20by%20Resource%20Nodes,%20Load%20Zones%20and%20Trading%20Hubs&showHTMLView=&mimicKey' 
page <- htmlParse(webURL) 
tableNodes <- getNodeSet(sitePage, "//table") 
myTable <- readHTMLTable(tableNodes[[3]]) 

ただし、これは最後の列ではなく、ハイパーリンクのテキストが含まれています。この表の最後の列の「zip」という単語をRの各行の対応するハイパーリンクの値に置き換えるにはどうすればよいですか?

答えて

2

あなたはXMLファイルまたはCSVファイルのいずれかをターゲットとすることができますので、あなたはURLだけでなく、ファイル名を取得できるようになる。このコードURLとファイル名を繰り返して、後で認識できる名前で保存します。

library(rvest) 
library(dplyr) 

pg <- read_html("http://mis.ercot.com/misapp/GetReports.do?reportTypeId=12300&reportTitle=LMPs%20by%20Resource%20Nodes,%20Load%20Zones%20and%20Trading%20Hubs&showHTMLView=&mimicKey") 

csv_fils <- html_nodes(pg, xpath=".//td[contains(@class, 'labelOptional_ind') and contains(., 'csv')]/..") 

data_frame(
    fil_name = html_nodes(csv_fils, "td.labelOptional_ind") %>% html_text(), 
    url = html_nodes(csv_fils, xpath=".//td[4]/div/a") %>% html_attr("href") 
) -> csv_df 

glimpse(csv_df) 
## Observations: 1,560 
## Variables: 2 
## $ fil_name <chr> "cdr.00.0000000000000000.20170729.094015151.LMPSROSNODENP6788_20170729_094011_csv.zip", "cdr... 
## $ url  <chr> "/misdownload/servlets/mirDownload?mimic_duns=&doclookupId=572923018", "/misdownload/servlets/mirD... 

xml_fils <- html_nodes(pg, xpath=".//td[contains(@class, 'labelOptional_ind') and contains(., 'xml')]/..") 

data_frame(
    fil_name = html_nodes(xml_fils, "td.labelOptional_ind") %>% html_text(), 
    url = html_nodes(xml_fils, xpath=".//td[4]/div/a") %>% html_attr("href") 
) -> xml_df 

glimpse(xml_df) 
## Observations: 1,560 
## Variables: 2 
## $ fil_name <chr> "cdr.00.0000000000000000.20170729.094015016.LMPSROSNODENP6788_20170729_094011_xml.zip", "cdr... 
## $ url  <chr> "/misdownload/servlets/mirDownload?mimic_duns=&doclookupId=572923015", "/misdownload/servlets/mirD... 
+0

これは私が探していたものです!あなたのお返事ありがとうございました。 xpath引数を生成する方法が不足していました。 HTMLを見てこのパラメータをどのように生成したのか、これを説明するいくつかの読み物を教えてください。 HTMLテーブルの構造が少し異なる可能性がある他のいくつかのWebサイトで同様の作業を行う必要があります。 – bmosov01

+1

それはあなたのユースケースのために働いてうれしい!私はビューソース(inspect-elementは間違ったセレクタにつながる可能性があります)を行い、テーブル構造に気付きました。最高の「

」デザインではありませんが、同じデータが含まれている可能性が高いため、CSVまたはXML(両方ともではない)が必要な場合もあります。それが私だったら、名前とURLが必要です。そこで、最初のXPath( '​​'&go 1を要素木の上に置いて調べてください)によって正しい ''をどのようにターゲットにするかを考えました。次に、名前の場合は「」、URLの場合はそれぞれ第1の「​​」を取得します。 XPathを狩るのに慣れるまでに時間がかかります。 – hrbrmstr

+0

別の優れた説明をありがとうございます。別の投稿を読んだ後、私はinspect-elementを無駄にしようとしましたが、これは意味があります。確かに私はちょうどCSVsをダウンロードするために探しています、そして、私はまだ持っていないファイルを収穫することができるので、あなたのソリューションが請求書100%に合うように、タイトルとファイル名を将来参照するように追跡したい。希望の「​​」を見つけてそこから要素ツリーを作成することについてのあなたの説明は、これをより一般的に将来的に行うのに役立ちます。 もう一度、非常に感謝! – bmosov01

2

XMLよりも簡単なrvestパッケージを使用しています。ここで

は、リンクのリストを取得するためのソリューションです:

webURL <- 'http://mis.ercot.com/misapp/GetReports.do?reportTypeId=12300&reportTitle=LMPs%20by%20Resource%20Nodes,%20Load%20Zones%20and%20Trading%20Hubs&showHTMLView=&mimicKey' 

library(rvest) 

page<-read_html(webURL) 
links<-page %>% html_nodes("a") %>% html_attr("href") 
+0

ありがとうございました。私はhrbrmstrから回答を選択しました。なぜなら、同様の方法で他のウェブサイトを掻き集めるのに、より包括的で柔軟性があったからです。 – bmosov01

関連する問題