我正在使用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中这样做!
谢谢!!
答案 0 :(得分: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
。如果你愿意,你可以只调查那些函数参数的内容,它应该让你更好地理解......
但不过,我可能完全错了:)