Jsoup очистка текста от дочерних элементов div

#java #html #css #jsoup

#java #HTML #css #jsoup

Вопрос:

Я пытаюсь извлечь обзор продукта по ссылке- Moto X с помощью JSoup, но он выдает исключение NullPointerException. Кроме того, я хочу извлечь текст, который отображается после нажатия ссылки «Подробнее» в обзоре.

 import java.io.*;
import org.jsoup.*;
import org.jsoup.nodes.*;
import org.jsoup.select.*;

public class JSoupEx
{
    public static void main(String[] args) throws IOException
    {
      Document doc = Jsoup.connect("https://www.flipkart.com/moto-x-play-with-turbo-charger-white-16-gb/product-reviews/itmefzwvdejejvth?pid=MOBEFM5HAFRNSJJA").get();
      Element ele = doc.select("div[class=qwjRop] > div").first();
      System.out.println(ele.text());
    }
}
  

Какие-либо решения?

Ответ №1:

Как предположил корнишон, используя вкладку network в инструментах разработчика, мы видим запрос, который получает отзывы (в формате JSON) в качестве ответа:

 https://www.flipkart.com/api/3/product/reviews?productId=MOBEFM5HAFRNSJJAamp;count=15amp;ratings=ALLamp;reviewerType=ALLamp;sortOrder=MOST_HELPFULamp;start=0
  

Используя анализатор JSON, такой как JSON.simple, мы можем извлекать такую информацию, как автор обзора, полезность и текст.

Пример кода

 String userAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36";
String reviewApiCall = "https://www.flipkart.com/api/3/product/reviews?productId=MOBEFM5HAFRNSJJAamp;count=15amp;ratings=ALLamp;reviewerType=ALLamp;sortOrder=MOST_HELPFULamp;start=";
String xUserAgent = userAgent   " FKUA/website/41/website/Desktop";
String referer = "https://www.flipkart.com/moto-x-play-with-turbo-charger-white-16-gb/product-reviews/itmefzwvdejejvth?pid=MOBEFM5HAFRNSJJA";
String host = "www.flipkart.com";
int numberOfPages = 2; // first two pages of results will be fetched

try {
    // loop for multiple review pages
    for (int i = 0; i < numberOfPages; i  ) {
        // query reviews
        Response response = Jsoup.connect(reviewApiCall (i*15)).userAgent(userAgent).referrer(referer).timeout(5000)
                .header("x-user-agent", xUserAgent).header("host", host).ignoreContentType(true).execute();

        System.out.println("Response in JSON format:nt"   response.body()   "n");

        // parse json response
        JSONObject jsonObject = (JSONObject) new JSONParser().parse(response.body().toString());
        jsonObject = (JSONObject) jsonObject.get("RESPONSE");
        JSONArray jsonArray = (JSONArray) jsonObject.get("data");

        for (Object object : jsonArray) {
            jsonObject = (JSONObject) object;
            jsonObject = (JSONObject) jsonObject.get("value");
            System.out.println("Author: "   jsonObject.get("author")   "thelpful: "
                      jsonObject.get("helpfulCount")   "nt"
                      jsonObject.get("text").toString().replace("n", "nt")   "n");
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}
  

Вывод

 Response in JSON format:
    {"CACHE_INVALIDATION_TTL":"132568825671","REQUEST":null,"REQUEST-ID": [...] }

Author: Flipkart Customer   helpful: 140
    A great phone at an affordable price with
    -an outstanding camera
    -great battery life
    -an excellent display
    -premium looks
     the flipkart delivery was also fast and perfect.

Author: Vaibhav Yadav   helpful: 518
    I m writing this review after using 2 months..
    First of all ..I must say this is one of the best product ..camera quality is best in natural lights or daytime..but in low light and in the night..camera quality is not so good but it's ok..
    It has good battery backup ..last one day on 3g usage ..while using 4g ..it lasts for about 10-12 hour..
    Turbo charges is good..although ..my charger is not working..
    Only problem in this phone is ..while charging..this phone heats a lot..this may b becoz of turbo charger..if u r using other charger than it does not heat..

Author: KAPIL CHOPRA    helpful: 9
[...]
  

Примечание: вывод усечен ([…])

Комментарии:

1. Мне нужно получить все обзоры, которые есть и на других страницах. Я попытался изменить строку ссылки, чтобы получить доступ к отзывам на странице номер 2 (параметр «страница»), но он по-прежнему показывает отзывы на первой странице. Есть предложения?

2. Добавьте параметр start и установите значение, кратное 15, поэтому для обзоров на второй странице его: flipkart.com/api/3/product /…

3. Изменен мой ответ: страницы first to теперь извлекаются в качестве демонстрации.

Ответ №2:

JSoup может анализировать только HTML, не запускать JavaScript, но искомое содержимое добавляется на страницу с помощью JavaScript, о чем Jsoup не знает.

Вам нужно что-то вроде selenium, чтобы получить то, что вы ищете, однако для этого конкретного сайта, который вы пытаетесь проанализировать, быстрый анализ его сетевых действий показывает, что все содержимое, которое вы ищете, извлекается из серверной части с помощью вызовов API, которые вы можете использовать, и делает контент намного лучше.более доступный без использования Jsoup.

Комментарии:

1. Flipkart.com имеет API для извлечения продуктов из серверной части, но у него нет методов для получения отзывов о продуктах. Любые другие альтернативы, которые можно использовать для получения обзоров без использования selenium?

2. Мне не удалось узнать запрос, но теперь я могу. Спасибо за помощь 🙂