我正在使用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类从上面的url中可以看到,我必须在HtmlContentHandler类中使用必要的参数调用startElemnt方法,以获取所需的代码。
`public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException`
{
}
因此,在我的visit方法中,我创建了一个HtmlContentHandler对象,并尝试调用上述的startElement方法。
HtmlContentHandler ecode=new HtmlContentHandler();
ecode.startElement(url,localName,qName,attributes);
现在问题出在该方法的参数上。我正在发送为url参数抓取的url值,但我不知道其余参数必须发送什么值!
有人可以帮我吗?我还知道还有很多其他工具可以使我的工作变得轻松,但是我想改为在crawler4j中做到这一点!
谢谢!!
我不太用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
。您可以根据需要调查这些函数参数的内容,它可以使您更好地理解...
但是有一点我可能完全错了:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句