Найти Xpath элемента в содержимом html-страницы с помощью java

Я начинаю использовать выражение xpath,

У меня есть ниже URL:

http://www.newark.com/white-rodgers/586-902/contactor-spst-no-12vdc-200a-bracket/dp/35M1913?MER=PPSO_N_P_EverywhereElse_None

который содержит html-контент страницы, используя следующие xpaths, он приводит к тому же элементу ul в javascript:

  1. //*[@id="moreStock_5257711"]
  2. //*[@id="priceWrap"]/div[1]/div/a/following-sibling::ul
  3. //html/body/div/div/div/div/div/div/div/div/div/div/a/following-sibling::ul

используя этот xpaths, как я должен получить тот же элемент ul в java

Я попытался использовать «очиститель html», но в xpath это не удалось -

"//*[@id="priceWrap"]/div[1]/div/a/following-sibling::ul",
"//html/body/div/div/div/div/div/div/div/div/div/div/a/following-sibling::ul"

это сработало для "//*[@id='moreStock_5257711']" этого xpath. Итак, ниже код, который я пробовал в очистителе html

package com.test.htmlcleaner.HtmlCleaner;

import java.io.IOException;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Test {
 public static void main(String[] args) {

  try {
 HtmlCleaner htmCleaner = new HtmlCleaner();
   CleanerProperties cleanerProperties = htmCleaner.getProperties();
   cleanerProperties.setTranslateSpecialEntities(true);
   cleanerProperties.setTransResCharsToNCR(true);
   cleanerProperties.setOmitComments(true);

   String s = "http://www.newark.com/white-rodgers/586-902/contactor-spst-no-12vdc-200a-bracket/dp/35M1913?MER=PPSO_N_P_EverywhereElse_None"; 
     Document doc = Jsoup.connect(s).timeout(30000).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2").get();

    String pageContent=doc.toString();
    TagNode node = htmCleaner.clean(pageContent);
    Object[] statsNode = node.evaluateXPath("//*[@id='moreStock_5257711']");
    if(statsNode.length > 0) {    
             for(int i=0;i<statsNode.length;i++){
               TagNode resultNode = (TagNode)statsNode[i];
               System.out.println("hi");
                System.out.println("Element Text : " +resultNode.getText().toString().trim());                 
               }
          }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (XPatherException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

Мне нужно, чтобы все xpaths работали с одним пакетом в java.

Может ли кто-нибудь предложить мне заставить работать все выражения xpaths для получения элемента ul с помощью java.

Спасибо за предварительные пожелания.


person user3008819    schedule 25.02.2015    source источник
comment
Покажите нам также свой код Java.   -  person Ravi K Thapliyal    schedule 25.02.2015
comment
Можете ли вы предложить мне, если очиститель html не может обработать, какой пакет лучше всего заставить все xpaths работать 1. //*[@id=moreStock_5257711] 2. //*[@id=priceWrap]/div[1]/div/a/ следующий-брат::ul 3. //html/body/div/div/div/div/div/div/div/div/div/div/a/following-sibling::ul URL: newark.com/white- Роджерс/586-902/   -  person user3008819    schedule 25.02.2015


Ответы (1)


Попробуйте отладить фактическое дерево HTML DOM, созданное HtmlCleaner. Используйте следующий код:

String pageContent = doc.toString();
TagNode node = htmCleaner.clean(pageContent);

StringWriter buffer = new StringWriter();
node.serialize(new PrettyHtmlSerializer(cleanerProperties), buffer);

System.out.println(buffer.toSting());

Теперь попробуйте применить все XPath к выходу этого буфера и посмотрите, почему они не работают.

person Ravi K Thapliyal    schedule 25.02.2015
comment
TagNode bufferContent = htmCleaner.clean(buffer.toString()); Object[] statsNode = bufferContent.evaluateXPath(//html/body/div/div/div/div/div/div/div/div/div/div/a/following-sibling::ul); Эти две строки я добавил после вашего кода. Не повезло, вы можете поделиться примером с этими похожими Xpaths - person user3008819; 25.02.2015
comment
Ты не понял меня. Моя идея состояла в том, чтобы изучить вывод System.out.println(buffer.toSting());, чтобы выяснить, почему XPath дает сбой. Буфер содержит дерево DOM, по которому оценивается ваш XPath, поэтому, если конкретный XPath не работает, это означает, что HtmlCleaner создал дерево, отличное от фактического источника HTML страницы. - person Ravi K Thapliyal; 25.02.2015