#javascript #html #ajax #javafx #webengine
#javascript #HTML #ajax #javafx #webengine
Вопрос:
Я пытаюсь получить HTML-код поиска по веб-сайту flipkart с помощью JavaFX frameworkwork. Приведенный ниже код работает хорошо, выдавая мне HTML-вывод, хотя и с небольшим сбоем. Кстати, я использую этот сгенерированный html для просмотра веб-сайта flipkart. Проблема в том, что файл jpeg, соответствующий продукту, отсутствует в теге image для большинства продуктов на html-странице. Я заметил, что для любого продукта в списке от 3 до 6 лучших продуктов указан тег image, в противном случае он пуст.
Те, у которых был тег, следующие
<DIV class="_3BTv9X" style="height: 240px; width:200px;">
<IMG class="_1Nyybr _30XEf0" alt="" src="https://rukminim1.flixcart.com/image/312/312/mobile/d/f/w/motorola-moto-e3-power-pa4c0009in-original-imaemj7xpcfhnu8r.jpeg?q=70"/>
</DIV>
а те, у которых нет тега, выглядят следующим образом
<DIV class="_3BTv9X" style="height: 240px; width: 200px;">
<IMG class="_1Nyybr" alt=""/>
</DIV>
Ниже приведена Java-программа, которая генерирует html.
Я хотел бы, чтобы кто-нибудь помог мне разобраться, почему теги изображений
пусты и как получить HTML-страницу с соответствующими тегами img.
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("HTML");
stage.setWidth(500);
stage.setHeight(500);
//Scene scene = new Scene(new Group());
//VBox root = new VBox();
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
webEngine.load("https://www.flipkart.com/search?q=Motorolaamp;otracker=startamp;as-show=onamp;as=off");
webEngine.getLoadWorker().stateProperty().addListener((observable, oldState, newState) -> {
if (newState == Worker.State.SUCCEEDED) {
try {
ByteArrayOutputStream b = new ByteArrayOutputStream();
printDocument(webEngine.getDocument(), b);
System.out.println(b.toString());
//FlipkartScrape(b.toString());
Platform.exit();
} catch(Exception e) {
System.out.println("Caught Exception");
Platform.exit();
}
}
});
//webEngine.load(null);
//Hyperlink hpl = new Hyperlink("https://www.flipkart.com");
//root.getChildren().addAll(hpl,browser);
//scene.setRoot(root);
//stage.setScene(scene);
//stage.show();
}
public static void printDocument(Document doc, OutputStream out) throws IOException, TransformerException {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
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(out, "UTF-8")));
}
public static void main(String[] args) {
launch(args);
}
public void FlipkartScrape(String html){
org.jsoup.nodes.Document doc = Jsoup.parse(html);
Elements a = doc.select("a[title]");
for (Element next: a) {
Element e;
String title = next.attr("title");
String href = next.attr("href");
href.replaceAll("/", "\\/");
if ((e = next.nextElementSibling()) != null) {
e = e.nextElementSibling();
if (e == null)
continue;
e = e.nextElementSibling();
if (e == null)
continue;
} else
continue;
if (href.equalsIgnoreCase(e.attr("href"))) {
href = "http://www.flipkart.com" href;
System.out.println(title);
System.out.println(e.text());
} else {
e = e.nextElementSibling();
if (e == null) continue;
System.out.println(title);
href = "http://www.flipkart.com" href;
System.out.println("TEXT" e.text());
}
Element parent = next.parent();
if (parent != null) {
parent = parent.parent();
if (parent == null) continue;
} else {
continue;
}
e = parent.nextElementSibling();
if (e != null) {
Elements imgs = e.select("img[class]");
for (Element img: imgs) {
String imghref = img.attr("src");
System.out.println("IMAGEHREF" imghref);
}
}
}
}
}
Комментарии:
1. Забыл упомянуть, что я уже пробовал PhantomJS, но, похоже, не работает для flipkart.com следовательно, необходимо каким-то образом заставить приведенный выше Java-код работать.