我试图在Google图片研究后获取每个src="path"
标记内的每个图片<img>
。
到现在为止,我可以查看所有HTML代码,然后我需要转换String中的所有HTML代码,最后得到一个&#34; substring&#34;从转换后的字符串中,应该是每个图像的图像URL。
我评论了代码中运行不正常的部分。如果您尝试,则会收到此错误:
java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-75875`
我不明白为什么会收到此错误。我究竟做错了什么?我在&#34; substring&#34;中尝试了几个参数作为参数。但是任何人都工作正常,我们现在的参数是尝试获取标签的全部内容(IMG)。
那么,我如何获取所有路径,然后保存它?
提前致谢
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
HBox hbox = new HBox();
WebView webview = new WebView();
final WebEngine webengine = webview.getEngine();
webengine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
public void changed(ObservableValue ov, State oldState, State newState) {
if (newState == Worker.State.SUCCEEDED) {
Document doc = webengine.getDocument();
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(doc),
new StreamResult(new OutputStreamWriter(System.out, "UTF-8")));
// StringWriter writer = new StringWriter();
// transformer.transform(new DOMSource(doc),
// new StreamResult((writer)));
// String output = writer.getBuffer().toString().replaceAll("\n|\r", "");
// System.out.println("Outputvale"+output);
// String immagine =output.substring(output.indexOf("<IMG")+1,output.indexOf("/>"));
// System.out.println(immagine);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
webengine.load("https://www.google.it/search?q=casa&biw=1440&bih=765&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiI0MvF0O3KAhUCGA8KHZixCzIQ_AUIBygC");
primaryStage.setScene(new Scene(webview, 800, 800));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 0 :(得分:1)
不要自己解析HTML,只需使用DOM API即可。另请注意,直接监听Web引擎的documentProperty()
可能更安全,而不是假设在加载工作完成时文档完全可用。
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
WebView webview = new WebView();
final WebEngine webengine = webview.getEngine();
webengine.documentProperty().addListener((obs, oldDoc, newDoc) -> {
if (newDoc != null) {
NodeList nodeList = newDoc.getElementsByTagName("img");
for (int i = 0; i < nodeList.getLength(); i++) {
Element img = (Element)nodeList.item(i);
String src = img.getAttribute("src");
System.out.println(src);
}
}
});
webengine.load("https://www.google.it/search?q=casa&biw=1440&bih=765&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiI0MvF0O3KAhUCGA8KHZixCzIQ_AUIBygC");
primaryStage.setScene(new Scene(webview, 800, 800));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 1 :(得分:-1)
IndexOf()将返回您的第一次出现。您尝试获取由&#34;&#34;。
组成的子字符串在您的情况下致电
output.indexOf("/>");
你的&#34; /&gt;&#34;是html文档中的第一个,也许是你的&#34; head-Tag&#34;或者是其他东西。这也可以解释负面的StringOutOfBoundsException。
你必须从&#34; IMG&#34;的索引中解析。直到&#34; /&gt;&#34;的第一次出现。这将是你的img-tag的结束。