代码之家  ›  专栏  ›  技术社区  ›  Alperen Taciroglu

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

  •  0
  • Alperen Taciroglu  · 技术社区  · 9 年前

    asker的提醒:我对HTML知之甚少,可以说对R。

    我有一个HTML源代码,我需要使用R(首选)或Python从中提取链接。

    我正在寻找的链接位于的嵌套结构中

    如中所示;

    <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>

    我需要提取在上面的代码末尾指定的链接。在“div id=“tabbed\u folder\u content”下有几个这样的链接。

    XML , RCurl , rvest ( read_html() html_nodes() )来自R语言和 bs4.BeautifulSoup() 来自Python。

    2 回复  |  直到 9 年前
        1
  •  1
  •   GGamba    9 年前

    R rvest 这应该足够简单。根据您发布的有限示例,这应该有效:

    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>'
    
        2
  •  1
  •   BigTimeStats    9 年前

    我喜欢GGamba的答案,但我自己更喜欢使用readLines函数,并通过正则表达式手动完成。这样,你可以非常明确地知道你想要拉什么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('.*a href=\"\".*\"\"\\s*tabindex=.*', text2, value = TRUE) %>% 
        gsub('.*a href=\"\"(.*)\"\"\\s*tabindex=.*', '\\1', .)
    

    或者网站格式上的这个正则表达式会产生相同的结果

    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]