2013-05-18 7 views
5

मैं XPath वाक्यविन्यास का उपयोग करते हुए that page पर मुख्य तालिका से लिंक को स्क्रैप करने के लिए आर का उपयोग कर रहा हूं। मुख्य तालिका पृष्ठ पर तीसरा है, और मुझे केवल पत्रिका लेख वाले लिंक चाहिए।आर: XPath अभिव्यक्ति चयनित तत्व के बाहर लिंक लौटाती है

मेरे कोड इस प्रकार है:

require(XML) 
(x = htmlParse("http://www.numerama.com/magazine/recherche/125/hadopi/date")) 
(y = xpathApply(x, "//table")[[3]]) 
(z = xpathApply(y, "//table//a[contains(@href,'/magazine/') and not(contains(@href, '/recherche/'))]/@href")) 
(links = unique(z)) 

आप उत्पादन को देखें, तो अंतिम लिंक मुख्य तालिका से लेकिन साइडबार से नहीं आते हैं, भले ही मैं पूछ कर मेरी तीसरी लाइन में मुख्य तालिका चयनित ऑब्जेक्ट y केवल तीसरी तालिका को शामिल करने के लिए।

मैं क्या गलत कर रहा हूं? XPath के साथ कोड करने के लिए सही/अधिक कुशल तरीका क्या है?

नोट: XPath नौसिखिया लेखन।

उत्तर दिया (वास्तव में जल्दी), बहुत बहुत धन्यवाद! मेरा समाधान नीचे है।

extract <- function(x) { 
    message(x) 
    html = htmlParse(paste0("http://www.numerama.com/magazine/recherche/", x, "/hadopi/date")) 
    html = xpathApply(html, "//table")[[3]] 
    html = xpathApply(html, ".//a[contains(@href,'/magazine/') and not(contains(@href, '/recherche/'))]/@href") 
    html = gsub("#ac_newscomment", "", html) 
    html = unique(html) 
} 

d = lapply(1:125, extract) 
d = unlist(d) 
write.table(d, "numerama.hadopi.news.txt", row.names = FALSE) 

यह कीवर्ड 'Hadopi' इस वेबसाइट पर साथ समाचार आइटम करने के लिए सभी लिंक बचाता है।

उत्तर

3

यदि आप वर्तमान नोड को खोज प्रतिबंधित करना चाहते हैं तो आपको . के साथ पैटर्न शुरू करने की आवश्यकता है। / दस्तावेज़ की शुरुआत में वापस चला जाता है (भले ही रूट नोड y में न हो)।

xpathSApply(y, ".//a/@href") 

वैकल्पिक रूप से, आप XPath के साथ सीधे तीसरे तालिका निकाल सकते हैं:

xpathApply(x, "//table[3]//a[contains(@href,'/magazine/') and not(contains(@href, '/recherche/'))]/@href") 
+1

यही काम किया, सवाल जवाब प्रतिबिंबित करने के लिए संपादित। धन्यवाद! –

संबंधित मुद्दे