我正在使用crawler4j抓取一些HTML文件,我想用自定义链接替换这些页面中的所有链接。目前,我可以使用以下代码获取源HTML和所有外发链接的列表:
HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
String html = htmlParseData.getHtml();
List<WebURL> links = htmlParseData.getOutgoingUrls();
然而,一个简单的foreach
循环和搜索&amp;替换不会得到我想要的东西。问题是athe WebURL.getURL();
将返回绝对URL,但有时链接是相对的,有时则不是。
我想处理所有链接(图片,网址,JavaScript文件等)。例如,我想将images/img.gif
替换为view.php?url=http://www.domain.com/images/img.gif
。
我遇到的唯一解决方案是使用有点复杂的Regex
,但我担心我会错过一些罕见的情况。这已经完成了吗?是否有图书馆或某种工具来实现这一目标?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
它必须是Java解决方案吗? PhantomJs与pjscrape结合可以抓取网页以查找所有网址。
您只需要创建配置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