java - 使用crawler4j获取html页面中存在的所有iframe、base64代码

标签 java html iframe crawler4j

我正在使用crawler4j来抓取一些网站,它工作正常。我能够下载网站中存在的所有文件,现在我面前有一个新任务。如果可能的话,我还需要提取 iframe、base64 和其他嵌入代码!

到目前为止我正在做的是,在我的访问方法中

 String place="<iframe";
 if (page.getParseData() instanceof HtmlParseData) {
                 HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
                 String text = htmlParseData.getText();
                 String html = htmlParseData.getHtml();
                 List<WebURL> links = htmlParseData.getOutgoingUrls();
                 System.out.println("Text length: " + text.length());
                // System.out.println("html sorce code:- "+html);
                 int number=html.length();
                 String[] result=html.split("\\s");
                 System.out.println("print random word"+result[12500]+number);
                 int i;
                 for(i=0;i<number;i++)
                 {
                     if(result[i].equals(place))
                     {
                         System.out.println("iframe found"+i);
                     }
                 }
                 System.out.println("Text length: " + text.length());
                 System.out.println("Html length: " + html.length());
                 System.out.println("Number of outgoing links: " + links.size());
                 }

我添加了上面的 if 案例来获取给定 html 页面的 iframe。它的工作几乎接近完美。

我知道这是从 html 页面提取 iframe 的不好方法。我尝试了很多其他方法从 html 页面提取 iframe 和其他嵌入代码,但都失败了。在查看源代码后,我发现了 java class这可以满足我的要求。从上面的url可以看到,我必须使用HtmlContentHandler类中的必要参数调用startElemnt方法才能获取所需的代码。

`public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException` 
{
}

因此,在我的访问方法中,我创建了一个 HtmlContentHandler 对象并尝试调用上面提到的 startElement 方法。

HtmlContentHandler ecode=new HtmlContentHandler();
 ecode.startElement(url,localName,qName,attributes);

现在问题出在该方法的参数上。我发送的是爬取的url值 对于 url 参数,我不知道必须为其余参数发送什么值!

有人可以帮我吗?我还知道,许多其他工具可以使我的工作变得轻松,但我想在crawler4j 中完成此操作!

谢谢!!

最佳答案

我不太用Java,也没有用过crawler4j,但这里是我的两分钱。

您引用的类 HtmlContentHandlerHtmlParser 用作从解析的网页中提取链接的实际处理程序的类。
也就是说,您不是应该调用 startElement() 函数的人,而是解析器会针对遇到的每个元素调用该函数。当调用时,这些参数将被填充,让您了解元素的细节。
这将是一个例子(未经测试,我真的不知道我在做什么):

HtmlParser htmlParser = new HtmlParser();
HtmlContentHandler contentHandler = new HtmlContentHandler();
// I presume the `Page page` is present in the scope
InputStream inputStream = new ByteArrayInputStream(page.getContentData());
Metadata metadata = new Metadata();
ParseContext parseContext = new ParseContext();
// and finally parse
htmlParser.parse(inputStream, contentHandler, metadata, parseContext);

如果要修改内容处理程序的行为,您应该重写 ContentHandler 方法并自行重写 startElement(),其方式与 HtmlContentHandler 类似。如果您愿意,您可以这样做只是为了调查这些函数参数的内容,它应该能让您更好地理解...

但是,我可能完全错了:)

关于java - 使用crawler4j获取html页面中存在的所有iframe、base64代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27482582/

相关文章:

javascript - 编辑 iframe 的 css(soundcloud 嵌入式播放器)

javascript - 防止cookie被发送到服务器

java - for循环内延迟,每2秒制作一次 toast

java - 防止某些用户修改 Neo4J 节点

javascript - 单页上的 Jquery 事件导航

html - 为了可读性, “for” 属性是否应该始终在 HTML <label> 标记中排在第一位?

java - java中的速记运算符与普通运算符有何不同?

java - OpenImaj - 人脸检测 - 显示找到的人脸

javascript - css 溢出无法正常工作

javascript - 通过 js 停止 youtube-iframe-video