1

我正在使用 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 case 来获取给定 html 页面的 iframe。它的工作几乎接近完美。

我知道这是从 html 页面中提取 iframe 的不好方法。我尝试了许多其他方法从 html 页面中提取 iframe 和其他嵌入式代码,但失败了。在查看源代码后,我找到了一个可以满足我的java 类要求。从上面的 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 中做到这一点!

谢谢!!

4

1 回答 1

0

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

您所指HtmlContentHandler的类是一个用作HtmlParser实际处理程序的类,用于从已解析的网页中提取链接。
也就是说,您不是应该调用该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

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

于 2014-12-25T11:29:27.117 回答