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

时间:2014-12-15 11:02:30

标签: 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 if case来获取给定html页面的iframe。它几乎接近完美。

我知道这是从html页面中提取iframe的一种糟糕方式。我尝试了很多其他方法从html页面中提取iframe和其他嵌入代码但是失败了。经过源代码后我找到了{{3从上面的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参数,我不知道我必须为其余参数发送什么值!

有人可以帮助我吗?还有一件事我知道很多其他工具可以让我的工作变得简单,但我想在crawler4j中这样做!

谢谢!!

1 个答案:

答案 0 :(得分:0)

我不太习惯使用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。如果你愿意,你可以只调查那些函数参数的内容,它应该让你更好地理解......

但不过,我可能完全错了:)