从HTML源代码中搜索链接(在网格内) - 使用R(首选)或Python

时间:2017-07-27 17:04:33

标签: python html r

在发布新问题之前,详细检查了几个帖子。希望这不是重复!

提问者:我不太了解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;
&#13;
&#13;

我需要提取上面代码末尾指定的链接。在&#34; div id =&#34; tabbed_folder_content&#34;下有几个这样的链接。

我已经安装了来自R语言的XMLRCurlrvestread_html()html_nodes())以及来自Python的bs4.BeautifulSoup()

我的有限知识表明,我无法提取链接,因为它们不在主页中,而是在网格中。 (?)谢谢。

2 个答案:

答案 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]