我正在使用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,但这里是我的两分钱。
您引用的类 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
类似。如果您愿意,您可以这样做只是为了调查这些函数参数的内容,它应该能让您更好地理解...
但是,我可能完全错了:)
关于java - 使用crawler4j获取html页面中存在的所有iframe、base64代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27482582/