0

我正在尝试从给定 Xpath 的文件中获取 html 代码。我尝试使用 HTMLUnit,但它似乎不能很好地处理从谷歌缓存下载的这些静态文件。我在使用 HTMLCleaner 时运气好一点,但到目前为止,我只能获取文本而没有 HTML 代码。任何的意见都将会有帮助。以下是我目前正在使用的代码。

TagNode tagNode = new HtmlCleaner().clean(readFile(htmlCacheFile));
Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode);

XPath xpath = XPathFactory.newInstance().newXPath();
String title = ((String) xpath.evaluate(TITLE_XPATH, doc, XPathConstants.STRING)).trim();
String body =  ((String) xpath.evaluate(BODY_XPATH, doc, XPathConstants.STRING)).trim();
4

2 回答 2

0

它必须是Java解决方案吗?使用在无头浏览器中运行的站点抓取工具完全可以实现您想要做的事情。PhantomJs是一个无头 WebKit,它允许您在网页上执行 JavaScript/CoffeeScript。我认为它可以帮助您解决问题。

Pjscrape是一个基于 PhantomJs的有用的网页抓取工具。

这是一个示例(config.js),它记录到控制台(也可以归档):

pjs.addSuite({
  url: 'http://stackoverflow.com/',
  noConflict: true,
  scraper: function() {
    var html = _pjs.$('body').html();
    return html;
  }
});

开始它phantomjs pjscrape.js config.js

结果是:

* Suite 0 starting
* Opening http://stackoverflow.com/
* Scraping http://stackoverflow.com/
* Suite 0 complete
* Writing 1 items
["\n    <noscript>&lt;div id=\"noscript-padding\"&gt;&lt;/div&gt;</noscript>\n    <div id=\"notify-container\"></div>\n    <div id=\"overlay-header\"></div>\n    <div id=\"custom-header\"></div>\n\n    <div class=\"container\">\n        <div id=\"header\">\n            <div id=\"portalLink\">\n                <a class=\"genu\" onclick=\"StackExchange.ready(function(){genuwine.click();});return false;\">Stack Exchange</a>\n   

...
于 2013-01-05T18:33:53.270 回答
0

也许这有帮助。在下面的链接中有相同问题的 XPath 示例和 JSoup 解决方案。如果你熟悉 CSS 选择器(有很多解析、清理等方法),请使用 jsoup,它是一个非常强大的 html 解析库。如果我理解目标是从文件中获取正文和标题。

我对这个问题的解决方案是:

Document webpage = Jsoup.parse(new File("file.html"), "UTF-8");
System.out.println(webpage.title()+" "+webpage.body().html());

https://norrisshelton.wordpress.com/2011/01/27/jsoup-java-html-parser/

于 2013-01-05T19:21:10.067 回答