使用JSoup从HTML中提取数据

时间:2016-01-17 08:19:09

标签: java jquery html css jsoup

我正在编写一个脚本来从HTML文档中提取数据。这是文件的一部分。

null

我正在使用Jsoup而不太确定如何实现这一目标。

文档中有很多div标签,我尝试与其唯一属性匹配。 假设<div class="info"> <div id="info_box" class="inf_clear"> <div id="restaurant_info_box_left"> <table id="rest_logo"> <tr> <td> <a itemprop="url" title="XYZ" href="XYZ.com"> <img src="/files/logo/26721.jpg" alt="XYZ" title="XYZ" width="100" /> </a> </td> </tr> </table> <h1 id="Name"><a class="fn org url" rel="Order Online" href="XYZ.com" title="XYZ" itemprop="name">XYZ</a></h1> <div class="rest_data" itemprop="address" itemscope itemtype="http://schema.org/PostalAddress"> <span itemprop="telephone">(305) 535-1379</span> | <b> <span itemprop="streetAddress">1755 Alton Rd</span>, <span itemprop="addressLocality">Miami Beach</span>, <span itemprop="addressRegion">FL</span> <span itemprop="postalCode">33139</span></b> </div> <div class="geo"> <span class="latitude" title="25.792588"></span> <span class="longitude" title="-80.141214"></span> </div> <div class="rest_data">Estimated delivery time: <b>45-60 min</b></div> </div> </div> 标记的div属性值为&#34; info&#34;

class

如果匹配,我必须使用 Elements divs = doc.select("div"); for (Element div : divs) { String divClass = div.attr("class").toString(); if (divClass.equalsIgnoreCase("rest_info")) { } &#34; rest_logo&#34;获取tableid标记内。

使用div时,看起来解析器会搜索整个文档。

我需要实现的是,如果匹配doc.select("table")代码属性,我需要在匹配的div代码中获取elementsattributes

div

任何想法?

3 个答案:

答案 0 :(得分:1)

    for (Element e : doc.select("div.info")) {
        System.out.println("Name: " + e.select("a.fn").text());
        System.out.println("telephone: " + e.select("span[itemprop=telephone]").text());
        System.out.println("streetAddress: " + e.select("span[itemprop=streetAddress]").text());
        // .....
    }

答案 1 :(得分:0)

我将如何做到这一点:

Document doc = Jsoup. parse(myHtml);

Elements elements = doc.select("div.info")
    .select(”a[itemprop=url], span[itemprop=telephone], span[itemprop=streetAddress], span[itemprop=addressLocality], span[itemprop=addressRegion], span[itemprop=postalCode], span.longitude, span.latitude”);
elements.add(doc.select("div.info > div.rest_data").last());

for (Element e:elements) {
   if (e.hasAttr("itemprop”)) {
       System.out.println(e.attr("itemprop") + e.text());
    }
    if (e.hasAttr("itemprop”) && e.attr("itemprop").equals ("url")) {
        System.out.println("name: " + e.attr("title"));
    }

    if (e.attr("class").equals("longitude") || e.attr("class").equals("latitude")) {
        System.out. println(e.attr("class") + e.attr("title"));
    }

    if (e.attr("class").equals("rest_data")) {
        System.out.println(e.text());
    }
}

(注意:我在手机上写了这个,所以未经测试,但应该可以使用,也可能包含拼写错误)

一点解释:首先通过doc.select(...)获取所有需要的元素,然后从每个元素中提取所需的数据。

让我知道它是否有效。

答案 2 :(得分:0)

可能要认识到的主要事情是可以直接选择具有id的元素 - 无需遍历搜索它的元素集合。

我没有使用过JSoup,我的Java非常生疏,但是这里......

// 1. Select elements from document
Element container = doc.select("#restaurant_info_box_left"); // find element in document with id="restaurant_info_box_left"
Element h1 = container.select("h1"); // find h1 element in container
Elements restData = container.select(".rest_data"); //find all divs in container with class="rest_data"
Element restData_0 = restData.get(0); // find first rest_data div
Element restData_1 = restData.get(1); // find second rest_data div
Elements restData_0_spans = restData_0.select("span"); // find first rest_data div's spans
Elements geos = container.select(".geo"); // find all divs in container with class="geo"
Element geo = geos.get(0); // find first .geo div
Elements geo_spans = geo.select("span"); // find first .geo div's spans

// 2. Compose output

// h1 text
String text = "Name: " + h1.text();
// output text >>>

// restData_0_spans text
for (Element span : restData_0_spans) {
    String text = span.attr("itemprop").toString() + ": " + span.text();
    // output text >>>
}

// geo data
for (Element span : geo_spans) {
    String text = span.attr("class").toString() + ": " + span.attr("title").toString();
    // output text >>>
}

// restData_1 text
String text = restData_1.text();
// output text >>>

对于习惯使用JavaScript / jQuery的人来说,这一切似乎都很费劲。幸运的是,它可能会有所简化。