我想知道是否有更有效的方法来实现我的目标。我目前正在编写蜘蛛算法来每天早上获取新闻报道,我想从首页过滤掉初始链接,忽略我不关心的内容。
您可以使用以下代码生成可重现的示例:
library(RCurl)
library(XML)
opts = list(
proxy = "***.***.***.***", #insert your proxy
proxyusername = "domain\\username",
proxypassword = "password",
proxyport = ****) #insert your port number
links <- 'http://www.cnn.com'
xpaths <- c('//ul[@id="us-menu"]//a', '//div[@id="cnn_maint1lftf"]//a', '//div[@id="cnn_maintt2bul"]//a', '//div[@id="cnn_maintoplive"]//a')
response <- getURL('www.cnn.com', .opts=opts)
doc <- htmlParse(response)
for (xpath in xpaths) {
li <- getNodeSet(doc, xpath)
links <- c(links, sapply(li, xmlGetAttr, 'href'))
}
links <- links[!duplicated(links)]
links <- links[-1]
以下是我希望提高效率的代码:
bad.words <- c('video', 'travel', 'living', 'health', 'ireport', 'bleacher', 'showbiz', 'mcafee')
t.1 <- sapply(links, function(x) sapply(bad.words, function(z) any(length(grep(z, x, ignore.case=T)) > 0)))
t.1 <- unname(t.1)
t.1 <- colSums(t.1)
links <- links[!t.1]
我必须假设有一种更清洁,更有效的方法来实现我的目标。有什么想法吗?
答案 0 :(得分:2)
在这种情况下,您可以使用正则表达式。重要的是,你的坏词列表没有任何特殊的&#34;正则表达式字符,如句号或其他标点符号。但如果是这样的话,你可以把它们粘在一起,用一个grep做一切。我们通过将所有单词与&#34;或&#34;一起粘贴来创建正则表达式。操作
bad.words <- c('video', 'travel', 'living', 'health',
'ireport', 'bleacher', 'showbiz', 'mcafee')
re <- paste0("\\b(",paste(bad.words, collapse="|"),")\\b")
links <- links[ !grepl(re, links) ]
我们还添加边界匹配\b
以确保我们匹配完整的单词。但这意味着它不会像&#34;视频&#34;所以要确保你想要的是什么。