在发布新问题之前,详细检查了几个帖子。希望这不是重复!
提问者:我不太了解HTML,敢说R的平均知识。
我有一个HTML源代码,我需要使用R(首选)或Python来从中提取链接。
编辑:28/07/17
我正在寻找的链接是
的嵌套结构如同;
<body class="browserclass_chrome"> ==$0
<form name="aspnetForm" method="post" action="./objectDetails.aspx?...
id="aspnetForm">
<div id="content">
<div id="contentMain">
<div id="contentMainContent">
<div id="tabbed_folder_content"> == $0
<div id="wholeSlidesGrid" class=folderContentGrid active-grid" style> == $0
<div id="pxl-ag-grid" style="height:100%; width: 100%;" class="ag-material">
<a href="https://etc.etc.aspx?id=XXXXX&type=r" tabindex="-1">P_xxxxxx
</a>
</div>
</div>
</div>
</div>
</div>
</div>
&#13;
我需要提取上面代码末尾指定的链接。在&#34; div id =&#34; tabbed_folder_content&#34;下有几个这样的链接。
我已经安装了来自R语言的XML
,RCurl
,rvest
(read_html()
和html_nodes()
)以及来自Python的bs4.BeautifulSoup()
。
我的有限知识表明,我无法提取链接,因为它们不在主页中,而是在网格中。 (?)谢谢。
答案 0 :(得分:1)
使用rvest
的{{1}}这应该很简单。根据您发布的有限示例,这应该有效:
library(rvest)
read_html(text) %>%
html_nodes('#tabbed_folder_content') %>%
html_nodes('a') %>%
html_attr('href')
#> [1] "https://etc.etc.aspx?id=XXXXX&type=r"
#> [2] "https://etc.etc.aspx?id=YYYYY&type=r"
使用:
text <- '<div id="tabbed_folder_content"> == $0
<div id="wholeSlidesGrid" class=folderContentGrid active-grid" style> == $0
<div id="pxl-ag-grid" style="height:100%; width: 100%;" class="ag-material">
<a href="https://etc.etc.aspx?id=XXXXX&type=r" tabindex="-1">" P_xxxxxx
</a>
<a href="https://etc.etc.aspx?id=YYYYY&type=r" tabindex="-1">" P_xxxxxx
</a>
</div>
</div>
</div>'
答案 1 :(得分:1)
我喜欢GGamba的答案,但我自己更喜欢使用readLines函数并通过regex手动完成。这样,您可以非常具体地了解您希望提取的URL,以防这些节点中存在其他URL。另外,我从未和Rvest好运,哈哈。
text <- '<div id="tabbed_folder_content"> == $0
<div id="wholeSlidesGrid" class=folderContentGrid active-grid" style> == $0
<div id="pxl-ag-grid" style="height:100%; width: 100%;" class="ag-material">
<a href="https://etc.etc.aspx?id=XXXXX&type=r" tabindex="-1">" P_xxxxxx
</a>
<a href="https://etc.etc.aspx?id=YYYYY&type=r" tabindex="-1">" P_xxxxxx
</a>
</div>
</div>
</div>'
write.csv(text, 'text.txt', row.names = FALSE)
您可以将url或html对象放入readLines函数
text2 <- readLines('text.txt')
在这里使用grep和Regex来识别要拉的行。
grep('.*a href=\"\".*\"\"\\s*tabindex=.*', text2, value = TRUE) %>%
gsub('.*a href=\"\"(.*)\"\"\\s*tabindex=.*', '\\1', .)
或者此网站格式的REGEX产生相同的结果
grep('.*etc\\.etc\\.aspx.*', text2, value = TRUE) %>%
gsub('.*a href=\"\"(.*)\"\"\\s*tabindex=.*', '\\1', .)
如果你只能通过使用grep和value = FALSE来识别你想要拉出的行之上的行,这会产生该行的索引。这个特别有用。
例如:
index <- grep('<div id=\"\"pxl-ag-grid\"\" style=\"\"height:100%; width: 100%;\"\" class=\"\"ag-material\"\">', text2, value = FALSE)
text2[index + 1]