2016-08-23 3 views
1

私はウェブスクレイピングにはまったく新しく、Rを使用してウェブサイトのソースコード/ htmlの情報にアクセスするスクレーパーを構築しようとしています。Rを使用してウェブサイトのソースコード/ htmlから情報をスクラップするにはどうすればよいですか?

具体的には、(数字の)ウェブサイトs)のIDに特定のテキスト( "google_ads_iframe")があります。 IDは常にこれより長くなるので、ワイルドカードを使用する必要があると思います。

私はいくつかのオプションを試しましたが(下記参照)、これまでのところ何も働いていません。

1方法:

doc <- htmlTreeParse("http://www.funda.nl/") 

data <- xpathSApply(doc, "//div[contains(@id, 'google_ads_iframe')]", xmlValue, trim = TRUE) 

エラーメッセージ読み取り:

Error in UseMethod("xpathApply") : 
    no applicable method for 'xpathApply' applied to an object of class "XMLDocumentContent" 

2方法:空のリストとして

scrapestuff <- scrape(url = "http://www.funda.nl/", parse = T, headers = T) 

x <- xpathSApply(scrapestuff[[1]],"//div[contains(@class, 'google_ads_iframe')]",xmlValue) 

X戻ります。

3方法:

scrapestuff <- read_html("http://www.funda.nl/") 
hh <- htmlParse(scrapestuff, asText=T) 
x <- xpathSApply(hh,"//div[contains(@id, 'google_ads_iframe')]",xmlValue) 

ここでも、Xは、空のリストとして返されます。

私が間違っていることを理解できないので、どんな助けも本当に素晴らしいでしょう!

+0

機能のパッケージは何ですか? – nya

+0

テキスト中の出現回数を数える簡単な方法は、scrapestuffが文字である可能性がある場合は、 'sum(stringr :: str_count(scrapestuff、" google_ads_iframe "))'を使用することです。 [ここ](http://stackoverflow.com/a/15356666/5967807)をチェックしてください。 – nya

+0

実際には、HTML/XMLの場合、HTML/XMLの出現回数を数える簡単な方法は、例えば 'xml_find_first(pg、" count(.// div [contains(@class、 'featured')] ) ")' – hrbrmstr

答えて

2

私の広告ブロッカーは、おそらく私にGoogle広告のiframeが表示されないようにしていますが、何かの存在をテストするためのR関数を追加してサイクルを浪費する必要はありません。あなたのための作業を行うと、ちょうどboolean()であなたのXPathをラップ(rvestxml2パッケージを支えている)libxml2に最適化されたC関数をしてみましょう:あなたが対処する必要があります

library(xml2) 

pg <- read_html("http://www.funda.nl/") 

xml_find_lgl(pg, "boolean(.//div[contains(@class, 'featured')])") 
## [1] TRUE 

xml_find_lgl(pg, "boolean(.//div[contains(@class, 'futured')])") 
## [1] FALSE 

もう一つの問題は、Googleのことです広告のiframeは、ページソースを取得するためにRSeleniumを使用することを意味します(このメソッドを結果のページソースとともに使用することができます)。

UPDATE

は、私はそれにgoogle_ads_iframeとページの例を見つけました:

しかし、レンダリングされたページだ、と私はあなたがまだページを行うにはRSeleniumを使用する必要があります疑う
pg <- read_html("http://codepen.io/anon/pen/Jtizx.html") 

xml_find_lgl(pg, "boolean(.//div[iframe[contains(@id, 'google_ads_iframe')]])") 
## [1] TRUE 

xml_find_first(pg, "count(.//div[iframe[contains(@id, 'google_ads_iframe')]])") 
## [1] 3 

つかむ。ここでは(あなたは、合理的なオペレーティングシステムにしているとインストールphantomjsを持っている場合はそうでない場合は、Firefoxでそれを使用する)それを行う方法は次のとおりです。

library(RSelenium) 
RSelenium::startServer() 
phantom_js <- phantom(pjs_cmd='/usr/local/bin/phantomjs', extras=c("--ssl-protocol=any")) 
capabilities <- list(phantomjs.page.settings.userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.3") 
remDr <- remoteDriver(browserName = "phantomjs", extraCapabilities=capabilities) 
remDr$open() 

remDr$navigate(URL) 
raw_html <- remDr$getPageSource()[[1]] 

pg <- read_html() 
... 

# eventually (when done) 
phantom_js$stop() 

NOTE

私はcodepen例で使用したXPath( Googleの広告iframeがあるため)が必要でした。あなたが最初divをターゲットにしたいあなたはそれで属性を検索したい場合は、子ターゲットを追加する必要がある場合

<div id="div-gpt-ad-1379506098645-3" style="width:720px;margin-left:auto;margin-right:auto;display:none;"> 
    <script type="text/javascript"> 
    googletag.cmd.push(function() { googletag.display('div-gpt-ad-1379506098645-3'); }); 
    </script> 
    <iframe id="google_ads_iframe_/16833175/SmallPS_0" name="google_ads_iframe_/16833175/SmallPS_0" width="723" height="170" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" src="javascript:&quot;<html><body style='background:transparent'></body></html>&quot;" style="border: 0px; vertical-align: bottom;"></iframe></div> 

iframeタグはそうdivの子である:ここではiframeが存在抜粋です。

+0

ありがとう、残念ながら、それはかなりうまくいきません。あなたの例は正常に動作します。 xml_find_lgl(pg、 "boolean(.// div [contains(@id、google_ads_iframe ')])"次の例としてこれを使用すると、falseを返します。 ) –

+0

divにはそのidが含まれていないため、そのidを持つiframeが含まれています。 – hrbrmstr

+0

それは本当にありがとう! –

関連する問題