2017-11-30 27 views
1

rvestを使ってWebスクレイピングプロジェクトを進めています。マッチングCSSが発見されたどこurlからベクトル要素を関数の個々の引数として渡す方法R

html_text(html_nodes(url, CSS)) 

データを抽出します。私の問題は、私が掻き集めているウェブサイトが、リストされた製品ごとに一意のCSS IDListItem_001_Priceなど)を使用していることです。だから、1 CSSは正確に1つのアイテムの価格を定義するので、自動化されたウェブスクレイピングは

が、私は手動ですべての製品のCSS IDのベクトル

V <- c("ListItem_001_Price", "ListItem_002_Price", "ListItem_003_Price") 

を作成することができます動作しません。個々の要素を一度にhtml_nodes()関数に渡すことは可能ですか?結果として得られるデータを1つのベクトル/データフレームとして戻しますか?

どのように動作させるには?

答えて

1

あなたはここにlapplyを使用して試すことができます:

V <- c("ListItem_001_Price", "ListItem_002_Price", "ListItem_003_Price") 
results <- lapply(V, function(x) html_text(html_nodes(url, x))) 

私はhtml_textにあなたのネストされた呼び出しは、一般的にV内の各項目について、一致するノードに対応するテキストの文字ベクトルを返すことを、ここで想定しています。これにより、あなたがアクセスできるベクトルのリストが残されます。

+0

ありがとう、ティム、それは完璧に動作します!内部の '関数(x)'は、私が理解できなかったものでした。 – Juraj

0

html_nodes()には、最初に "。"が必要です。 css-classであなたのタグを見つける。あなたはsugestのように手動で

V <- c(".ListItem_001_Price", ".ListItem_002_Price", ".ListItem_003_Price")

を作成することができ、私はあなたがユーザーの正規表現ので、あなたは肉体労働を避けることができ'ListItem_([0-9]{3})_Price'のようなクラスを一致させることをお勧めします。 html-nodeオブジェクトではなく、マークアップの実際の文字列を正規表現してください。 (下を参照)

Rでは、apply()、lapplay()、sapplay()などは、短いループのように機能します。その中で、リスト、データフレーム、行列、ベクトルなどの多数の値を含むデータ型のすべてのメンバーに関数を適用できます。あなたのケースでは

は、それが好きで、それを考えているの仕組みを理解するために、ベクター、および先頭に方法です:あなたのケースでは

sapply(vector, function(x) THING-TO-DO-WITH-ITEM-IN-VECTOR)

を、あなたは何をする事を希望しますベクトルの項目をベクトル内の項目に対応するhtml_textのフェッチとします。 例えば、以下のコードを参照してください:

library(rvest) 
# An example piece of html 
example_markup <- "<ul> 
<li class=\"ListItem_041_Price\">Brush</li> 
<li class=\"ListItem_031_Price\">Phone</li> 
<li class=\"ListItem_002_Price\">Paper clip</li> 
<li class=\"ListItem_012_Price\">Bucket</li> 
</ul>" 
html <- read_html(example_markup) 


# Avoid manual creation of css with regex 
regex <- 'ListItem_([0-9]{3})_Price' 
# Note that ([0-9]{3}) will match three consecutive numeric characters 
price_classes <- regmatches(example_markup, gregexpr(regex, example_markup))[[1]] 
# Paste leading "." so that html_nodes() can find the class: 
price_classes <- paste(".", price_classes, sep="") 

# A singel entry is found like so: 
html %>% html_nodes(".ListItem_031_Price") %>% html_text() 

# Use sapply to get a named character vector of your products 
# Note how ".ListItem_031_Price" from the line above is replaced by x 
# which will be each item of price_classes in turn. 
products <- sapply(price_classes, function(x) html %>% html_nodes(x) %>% html_text()) 

製品の結果は、名前の文字ベクトルです。名前を削除するにはunname(products)を使用してください。

+0

偉大な説明は、あなたの豊富な投稿からたくさん学んだ、仲間!他の機能をここで共有してくれてありがとう。 – Juraj

関連する問題