也试过
该列表部分由客户端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);
你能提供的网址? –
4个缺失元素的HTML是什么样的?你尝试过使用'li [class * = product-tile]'作为你的选择器吗? –
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