2016-10-21 18 views
3

私はウェブページの内容の要約を書こうとしています。そのためには、無関係のテキストとデータをWebページからすべて抽出する必要があります。ウェブページからメインコンテンツを抽出するには?

私はボイラーパイプを使用しましたが、テキストの抽出は良くありません。結果は無関係のテキストがたくさんあるhereです。

また、ヘッダー、フッター、外部リンクなどを削除して、無関係なデータを取り除くためにJSoupを試しました。しかし、やはり結果はマークまでではありません。

Document doc = Jsoup.connect("www.anyurl.com").get() 
    doc.head().remove(); 
    doc.getElementsByTag("header").remove(); 
    doc.getElementsByTag("footer").remove(); 
    doc.getElementsByTag("form").remove(); 
    doc.getElementsByTag("table").remove(); 
    doc.getElementsByTag("meta").remove(); 
    doc.getElementsByTag("img").remove(); 
    doc.getElementsByTag("a").remove(); 
    doc.getElementsByTag("br").remove(); 

    doc.getElementsByClass("tags").remove(); 
    doc.getElementsByClass("copyright").remove(); 
    doc.getElementsByClass("widget").remove(); 

    doc.select("div[class*=foot").remove(); 
    doc.select("div[class*=tag").remove(); 
    doc.select("div[class*=Loading").remove(); 
    doc.select("div[class*=Widget").remove(); 
    doc.select("div[class*=Head").remove(); 
    doc.select("div[class*=menu").remove(); 
    doc.select("p[class*=link").remove(); 

    Elements paragraphs = doc.select("p"); 
    Elements divs = doc.select("div"); 

    formattedOutput = paragraphs.text() + divs.text(); 

これを行う方法を教えてもらえますか?ボイラーパイプ以外のJavaライブラリはありますか?

+0

からメインコンテンツ私はリンクを見て、私は「無関係な大量のテキストを」見ないの抽出物を使用することができます。私は、関連性のないものが意見の問題かもしれないので、無関係なテキストを削除する方法を尋ねるだけで、どこにでも簡単に行くことはできません。代わりに、あなたが何をしたいのかについて具体的な考えを与えてください。それとも、解決策は単にあなたがより具体的な考えを持つ必要があるということです。 – ajb

+1

** 1)**あなたが彼らの[利用規約](http://www.medicalnewstoday.com/terms)を見ていなければならない場合があります。 'あなたは、あなたに最初に連絡し、記事全体をオンラインにする旨の書面による許可を得ている場合を除き、あなたのサイトでのMedical News Todayの記事全文をお読みください。**これらの使用条件はすべて適用されます。 [newsfeeds](http://www.medicalnewstoday.com/newsfeeds-rss)は、あなたが探している情報をすでに提供しています。 – SubOptimal

答えて

0

私は、javaについてませんが、あなたは、ウェブページ

<?php 

class ContentExtractor { 

    var $container_tags = array(
      'div', 'table', 'td', 'th', 'tr', 'tbody', 'thead', 'tfoot', 'col', 
      'colgroup', 'ul', 'ol', 'html', 'center', 'span' 
     ); 
    var $removed_tags = array(
      'script', 'noscript', 'style', 'form', 'meta', 'input', 'iframe', 'embed', 'hr', 'img', 
      '#comment', 'link', 'label' 
     ); 
    var $ignore_len_tags = array(
      'span' 
     ); 

    var $link_text_ratio = 0.04; 
    var $min_text_len = 20; 
    var $min_words = 0; 

    var $total_links = 0; 
    var $total_unlinked_words = 0; 
    var $total_unlinked_text=''; 
    var $text_blocks = 0; 

    var $tree = null; 
    var $unremoved=array(); 

    function sanitize_text($text){ 
     $text = str_ireplace('&nbsp;', ' ', $text); 
     $text = html_entity_decode($text, ENT_QUOTES); 

     $utf_spaces = array("\xC2\xA0", "\xE1\x9A\x80", "\xE2\x80\x83", 
      "\xE2\x80\x82", "\xE2\x80\x84", "\xE2\x80\xAF", "\xA0"); 
     $text = str_replace($utf_spaces, ' ', $text); 

     return trim($text); 
    } 

    function extract($text, $ratio = null, $min_len = null){ 
     $this->tree = new DOMDocument(); 

     $start = microtime(true); 
     if ([email protected]$this->tree->loadHTML($text)) return false; 

     $root = $this->tree->documentElement; 
     $start = microtime(true); 
     $this->HeuristicRemove($root, (($ratio == null) || ($min_len == null))); 

     if ($ratio == null) { 
      $this->total_unlinked_text = $this->sanitize_text($this->total_unlinked_text); 

      $words = preg_split('/[\s\r\n\t\|?!.,]+/', $this->total_unlinked_text); 
      $words = array_filter($words); 
      $this->total_unlinked_words = count($words); 
      unset($words); 
      if ($this->total_unlinked_words>0) { 
       $this->link_text_ratio = $this->total_links/$this->total_unlinked_words;// + 0.01; 
       $this->link_text_ratio *= 1.3; 
      } 

     } else { 
      $this->link_text_ratio = $ratio; 
     }; 

     if ($min_len == null) { 
      $this->min_text_len = strlen($this->total_unlinked_text)/$this->text_blocks; 
     } else { 
      $this->min_text_len = $min_len; 
     } 

     $start = microtime(true); 
     $this->ContainerRemove($root); 

     return $this->tree->saveHTML(); 
    } 

    function HeuristicRemove($node, $do_stats = false){ 
     if (in_array($node->nodeName, $this->removed_tags)){ 
      return true; 
     }; 

     if ($do_stats) { 
      if ($node->nodeName == 'a') { 
       $this->total_links++; 
      } 
      $found_text = false; 
     }; 

     $nodes_to_remove = array(); 

     if ($node->hasChildNodes()){ 
      foreach($node->childNodes as $child){ 
       if ($this->HeuristicRemove($child, $do_stats)) { 
        $nodes_to_remove[] = $child; 
       } else if ($do_stats && ($node->nodeName != 'a') && ($child->nodeName == '#text')) { 
        $this->total_unlinked_text .= $child->wholeText; 
        if (!$found_text){ 
         $this->text_blocks++; 
         $found_text=true; 
        } 
       }; 
      } 
      foreach ($nodes_to_remove as $child){ 
       $node->removeChild($child); 
      } 
     } 

     return false; 
    } 

    function ContainerRemove($node){ 
     if (is_null($node)) return 0; 
     $link_cnt = 0; 
     $word_cnt = 0; 
     $text_len = 0; 
     $delete = false; 
     $my_text = ''; 

     $ratio = 1; 

     $nodes_to_remove = array(); 
     if ($node->hasChildNodes()){ 
      foreach($node->childNodes as $child){ 
       $data = $this->ContainerRemove($child); 

       if ($data['delete']) { 
        $nodes_to_remove[]=$child; 
       } else { 
        $text_len += $data[2]; 
       } 

       $link_cnt += $data[0]; 

       if ($child->nodeName == 'a') { 
        $link_cnt++; 
       } else { 
        if ($child->nodeName == '#text') $my_text .= $child->wholeText; 
        $word_cnt += $data[1]; 
       } 
      } 

      foreach ($nodes_to_remove as $child){ 
       $node->removeChild($child); 
      } 

      $my_text = $this->sanitize_text($my_text); 

      $words = preg_split('/[\s\r\n\t\|?!.,\[\]]+/', $my_text); 
      $words = array_filter($words); 

      $word_cnt += count($words); 
      $text_len += strlen($my_text); 

     }; 

     if (in_array($node->nodeName, $this->container_tags)){ 
      if ($word_cnt>0) $ratio = $link_cnt/$word_cnt; 

      if ($ratio > $this->link_text_ratio){ 
        $delete = true; 
      } 

      if (!in_array($node->nodeName, $this->ignore_len_tags)) { 
       if (($text_len < $this->min_text_len) || ($word_cnt<$this->min_words)) { 
        $delete = true; 
       } 
      } 

     } 

     return array($link_cnt, $word_cnt, $text_len, 'delete' => $delete); 
    } 

} 

/**************************** 
    Simple usage example 
*****************************/ 

$html = file_get_contents('http://en.wikipedia.org/wiki/Shannon_index'); 

$extractor = new ContentExtractor(); 
$content = $extractor->extract($html); 
echo $content; 

?> 
関連する問題