3

私はいくつかの HTML ファイルをクローラー 4jでクロールしており、それらのページのすべてのリンクをカスタム リンクに置き換えたいと考えています。現在、ソース HTML とすべての発信リンクのリストを次のコードで取得できます。

        HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
        String html = htmlParseData.getHtml();
        List<WebURL> links = htmlParseData.getOutgoingUrls();

ただし、単純なforeachループと検索と置換では、必要なものが得られません。問題は、atheWebURL.getURL();が絶対 URL を返しますが、リンクが相対である場合とそうでない場合があることです。

すべてのリンク (画像、URL、JavaScript ファイルなど) を処理したい。たとえば、 に置き換えたいと思いimages/img.gifますview.php?url=http://www.domain.com/images/img.gif

私に来る唯一の解決策は、やや複雑なRegexものを使用することですが、いくつかのまれなケースを見逃すことになるのではないかと心配しています. これはすでに行われていますか?これを達成するためのライブラリまたはツールはありますか?

4

2 に答える 2

0

これには正規表現を利用できると思います:

例えば ​​:

  ...
   String regex = "\\/[^.]*\\/[^.]*\\.";
   Pattern pattern =  Pattern.compile(regex);
   Matcher  matcher = pattern.matcher(text);

   while(matcher.find()){
    String imageLink =  matcher.group();
    text = text.replace(imageLink,prefix+imageLink);
   }
于 2013-01-03T13:04:45.853 に答える
0

Java ソリューションである必要がありますか? pjscrapeと組み合わせたPhantomJは、ページをサイトスクレイピングしてすべての URL を見つけることができます。

構成 JavaScript ファイルを作成するだけです。

getlinks.js:

pjs.addSuite({
    url: 'http://stackoverflow.com/questions/14138297/replace-all-urls-in-a-html',
    noConflict: true,
    scraper: function() {
          var links = _pjs.$('a').map(function() {
           // convert relative URLs to absolute
           var link = _pjs.toFullUrl($(this).attr('href'));
           return link;
      });
      return links.toArray();
    }
});
pjs.config({ 
  // options: 'stdout' or 'file' (set in config.outFile)
    log: 'stdout',
    // options: 'json' or 'csv'
    format: 'json',
    // options: 'stdout' or 'file' (set in config.outFile)
    writer: 'stdout',
    scrape_output.json
});

コマンドを実行しphantomjs pjscrape.js getlinks.jsます。この例では、出力はファイルに保存されます (コンソールに記録することもできます)。

(部分的な)出力は次のとおりです。

* Suite 0 starting
* Opening http://stackoverflow.com/questions/14138297/replace-all-urls-in-a-html
* Scraping http://stackoverflow.com/questions/14138297/replace-all-urls-in-a-html
* Suite 0 complete
* Writing 145 items
["http://stackoverflow.com/users/login?returnurl=%2fquestions%2f14138297%2freplace-all-urls-in-a-html","http://careers.stackoverflow.com","http://chat.stackoverflow.com","http://meta.stackoverflow.com","http://stackoverflow.com/about","http://stackoverflow.com/faq","http://stackoverflow.com/","http://stackoverflow.com/questions","http://stackoverflow.com/tags","http://stackoverflow.com/users","http://stackoverflow.com/badges","http://stackoverflow.com/unanswered","http://stackoverflow.com/questions/ask", ...
"http://creativecommons.org/licenses/by-sa/3.0/","http://creativecommons.org/licenses/by-sa/3.0/","http://blog.stackoverflow.com/2009/06/attribution-required/"]
* Saved 145 items
于 2013-01-03T18:27:51.580 に答える