【发布时间】:2023-04-03 05:25:01
【问题描述】:
我正在使用带有 R3.3.1 的 Windows 7。我有一个名为idsFinal_Attack 的数据框,它有两列。
Attack Type
1 40674
2 Netcore.Netis.Devices.Hardcoded.Password.Security.Bypass
3 DNS.Invalid.Size.Attack
4 Acunetix.Web.Vulnerability.Scanner
5 SIPVicious.SIP.Scanner
6 17799
New
1 SIPVicious.SIP.Scanner
2 Netcore.Netis.Devices.Hardcoded.Password.Security.Bypass
3 DNS.Invalid.Size.Attack
4 Acunetix.Web.Vulnerability.Scanner
5 SIPVicious.SIP.Scanner
6 MS.SMBv2.Infinite.Loop.DoS
第一个是“攻击类型”,由字符 ID 和数字 ID 组成。第二列是我希望用下面的代码填写的内容。
URL = 'http://www.fortinet.com/ids/VID'
idsFinal_Attack$New = character(length = nrow(idsFinal_Attack))
for (i in 1:nrow(idsFinal_Attack)) {
if (is.na(as.numeric(idsFinal_Attack$`Attack Type`[i]))) {
idsFinal_Attack$New[i] = idsFinal_Attack$`Attack Type`[i]
} else {
fortinetPage = readLines(paste0(URL, idsFinal_Attack$`Attack Type`[i]))
fortinetPage = grep("id=\"ency_title\">Vulnerability:", fortinetPage,
value = TRUE)
idsFinal_Attack$New[i] =
gsub("<h1 id=\"ency_title\">Vulnerability: |</h1>", "", fortinetPage)
}
}
对于“攻击类型”中包含字符串的行,我希望将该字符串复制并粘贴到“新建”列的相邻单元格中。对于“攻击类型”中包含数字条目的行,如第 1 行,我希望将该数值粘贴到变量“URL”的末尾,然后使用readLines() 函数提取网页的一部分,增强“ URL”变量将我带到,即http://www.fortinet.com/ids/VID40674。我只需要标题为“漏洞”的网页的一小部分以及后续文本。 readLines() 返回网页中的所有文本,然后我可以使用 grep 和 gsub 来获取所需的部分。数据框idsFinal_Attack 有 145 行,其中 67 行是数字,需要 readLines() 命令。下面的代码适用于其中大约一半,然后抛出如下所示的错误。
Error in readLines(url(paste0(URL, idsFinal_Attack$`Attack Type`[i]), : cannot open the connection
这是我的第一次尝试,我意识到代码可以更简洁。我只是想获得一个工作版本。我曾简单地试验过 XML 和 rvest 包,但没有任何运气。有人有什么建议吗?
【问题讨论】:
-
不要使用正则表达式解析 HTML。使用像
rvest或XML这样的 HTML 解析器。
标签: r web-scraping