2015-08-15 128 views
0

请参阅下图。加载红色箭头前的元素,但之后的4个元素不是由于某种原因。Jsoup选择不提取所有元素

enter image description here

我选择这些元件的方式是,

doc = Jsoup.connect(url).header("Accept-Encoding", "gzip, deflate").userAgent("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36").maxBodySize(0).timeout(600000).get(); 

Elements detailsBuyBoxContainer = doc.select("li[class^=product-tile]"); 
System.out.println(detailsBuyBoxContainer.size()); 

使用以下选择

/*Elements detailsBuyBoxContainer = doc.getElementsByAttributeValueContaining("class", 
"details-buy-box-container");*/ 

印刷尺寸应为24,而不是20

+1

你能提供的网址? –

+0

4个缺失元素的HTML是什么样的?你尝试过使用'li [class * = product-tile]'作为你的选择器吗? –

+0

url =“http://www.tesco.com/direct/search-results/results.page?searchquery=espresso+machine&SrchId=4294967294&catId=4294967294+4294814304&lastFilter=Type%7CEspresso+machine#prevTile=pt-765-7313_765- 7313“ – Sachin

回答

1
也试过

该列表部分由客户端JavaScript填充,即A JAX calles。 JSoup不运行Javascript并且不是浏览器,所以你尝试的天真方法无法工作。

我看到两个解决方案:

A)使用硒webdriver的,这是一个真正的浏览器并加载该AJAX的东西很好。

B)自己确定AJAX调用并使用JSoup直接调用Api url。解释这通常并不困难,尽管您可能需要使用不同的抓取技术,例如解释JSON而不是HTML。

附录

我看着易购网站多一点,似乎他们使用发送包含HTML JSON响应的有些古怪的做法。我想这可以在客户端上节省一些JavaScript工作,但它仍然有点奇怪。好吧。这是我使用浏览器网络选项卡捕获的呼叫。当您向下滚动列表时,将调用Ajax调用http://www.tesco.com/direct/blocks/catalog/productlisting/infiniteBrowse.jsp?&view=grid&catId=4294967294+4294814304&sortBy=&searchquery=espresso+machine&offset=20&lazyload=true

似乎偏移参数是您需要增加以获得更多结果的参数。这种调用的内容是一个包含两个属性的JSON对象:“产品”和“变体”。 products属性似乎包含html。

所以一步一步:

1)使用Jsoup(或例如Apache的HttpClient的),以获得Ajax调用的原始内容:

Connection con = Jsoup.connect("http://www.tesco.com/direct/blocks/catalog/productlisting/infiniteBrowse.jsp?&view=grid&catId=4294967294+4294814304&sortBy=&searchquery=espresso+machine&offset=20&lazyload=true") 
      .ignoreContentType(true);  
Response res = con.execute(); 
String rawJSON = res.body(); 

2)与库来解析JSON你喜欢。我通常使用Json-Simple

JSONObject o = (JSONObject) JSONValue.parse(html); 
String html = (String) o.get("products"); 

。注意,JSON,简单易于使用,但不使用泛型。杰克逊也可能想看看吉森。

3)解析HTML与JSoup:

Document doc = Jsoup.parse(html); 
+0

我已经开始使用选项'B'。我设法使用萤火虫捕获AJAX呼叫。你能否提供更多的细节/参考链接使用Jsoup进行API调用以及如何解析JSON?同时我也在尝试谷歌。 – Sachin

+0

非常感谢。我只是试过,它的工作。正是我在找什么。 – Sachin

1

检查网站的代码,并寻求产生你错过了元素的AJAX功能,那么你必须把你的Jsoup函数的调用。连接功能!

This could help you!