JSOUP Войдите в систему, затем проанализируйте и найдите цену в HTML-строке
У меня программа в основном разобралась. Мне просто нужно вытащить цену из этой строки HTML: <li class=""><b class="">Your Price:</b> $23.51 <b class="">You Save:</b> $11.48</li>
Мне просто нужно "23,51" из этой строки, тот, который указан в качестве вашей цены.
Я обновил код, чтобы отразить то, с чем я сейчас работаю. Я не уверен, каким будет следующий шаг.
Я не знаю, где добавить в разборе. Мне нужно, чтобы взять URL из электронной таблицы, а затем поместить данные о ценах в соответствующий столбец (PRICE_COLUMN).
Вот мой код, спасибо Кристиану.
public class Scraper {
private static final int URL_COLUMN = 2; // Column C
private static final int SKU_COLUMN = 3; // Column D
private static final int SALE_COLUMN = 4;// Column E
private static final int PRICE_COLUMN = 5; //Column F
public static void main(final String[] args) throws Exception {
Workbook originalWorkbook = Workbook.getWorkbook(new File("C:/Users/MSI/Desktop/original.xls"));
WritableWorkbook workbook = Workbook.createWorkbook(new File("C:/Users/MSI/Desktop/updated.xls"), originalWorkbook);
originalWorkbook.close();
WritableSheet sheet = workbook.getSheet(0);
int currentRow = 1;
Cell cell;
while (!(cell = sheet.getCell(URL_COLUMN, currentRow)).getType().equals(CellType.EMPTY)) {
String url = cell.getContents();
System.out.println("Parsing URL: " + url);
String SKU = parseUrlWithJsoupAndGetProductSKU(url);
String price = parseUrlWithJsoupAndGetProductPrice(url);
String sale= parseUrlWithJsoupAndGetSale(url);
System.out.println("SKU: " + SKU);
System.out.println("Regular price: " + price);
System.out.println("Sale price: " + sale);
Label cellWithSKU = new Label(SKU_COLUMN, currentRow, SKU);
sheet.addCell(cellWithSKU);
Label cellWithSale = new Label(SALE_COLUMN, currentRow, sale);
sheet.addCell(cellWithSale);
Label cellWithPrice = new Label(PRICE_COLUMN, currentRow, price);
sheet.addCell(cellWithPrice);
currentRow++;
}
workbook.write();
workbook.close();
}
private static String parseUrlWithJsoupAndGetProductSKU(String url) throws IOException {
try {
Document doc = Jsoup.connect(url).userAgent("Mozilla").get();
return doc.select("#product_id_num").text();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private static String parseUrlWithJsoupAndGetSale(String url) throws IOException {
try {
Document doc = Jsoup.connect(url).userAgent("Mozilla").get();
return doc.select("#NA").text();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private static String parseUrlWithJsoupAndGetProductPrice(String url) throws IOException {
try {
Document doc = Jsoup.connect(url).userAgent("Mozilla").get();
System.out.println(getPrice(doc));
return doc.select("#price").text();
private static String price(Document doc) {
// select all <li> inside <ul class="small">
Elements liElements = doc.select("ul.small>li");
for (Element li : liElements) {
// find "List Price:"
if (li.text().contains("List Price:")) {
// remove <b> with contents
li.select("b").remove();
// there's only price left in <li>
return li.text();
}
}
return "not found";
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
1 ответ
Объяснение в комментариях:
public static void main(final String[] args) throws IOException {
Document doc = Jsoup
.parse("<ul class=\"small\"> <li class=\"\"><b class=\"\">Description:</b> . (Import)</li> <li class=\"\"><b class=\"\">List Price:</b> $123</li> <li class=\"\"><b class=\"\">Your Price:</b> $*** <b class=\"\">You Save:</b> $***</li> <li class=\"stockStatus\"><b class=\"\">Stock Status:</b> 1</li> <h3 class=\"additionalInfo\"><span class=\"\">Additional Information</span></h3> <li class=\"additional\">Uses extension part# ***</li> <li class=\"additional\">Replaces GM# ***</li> </ul> ");
System.out.println(getPrice(doc));
}
private static String getPrice(Document doc) {
// select all <li> inside <ul class="small">
Elements liElements = doc.select("ul.small>li");
for (Element li : liElements) {
// find "List Price:"
if (li.text().contains("List Price:")) {
// remove <b> with contents
li.select("b").remove();
// there's only price left in <li>
return li.text();
}
}
return "not found";
}