web-dev-qa-db-fra.com

JSOUP sélectionnez <div> avec un ID spécifique

Je fais une petite Android pour une classe où je trouve des événements liés au cancer sur le site Web de l'American Cancer Society. J'utilise JSoup pour obtenir des informations de base sur les événements et pour obtenir des informations spécifiques sur le site Web, j'ai essayé d'utiliser la méthode select (). Cependant, la méthode actuelle que j'utilise prend beaucoup plus de nœuds HTML que je ne le souhaiterais et je n'ai pas pu comprendre pourquoi. suis en train de saisir ressemble à ceci:

EDIT: J'ai réalisé que le où id = "pnlResults" ne se termine pas à cette table, il se termine après environ 3 autres tables, toutes avec des informations que j'aimerais saisir. Voici à nouveau le tableau

    <div id="pnlResults">

        <h2><span id="lblEventName">American Cancer Society 44th Annual Walter Hagen Golf Tournament</span></h2>
        <!-- General Information Box -->
        <div class="text-box boxed wide">
            <h3 class="head" style="width:97%;">
                General Information
            </h3>
            <div class="content">


                <p>
                    <label>Event Times:</label><span id="lblStartDate">Monday, July 30, 2012</span><span id="lblEndDate"></span><br />
                    <label>&nbsp;</label><span id="lblStartTime">10:00 AM</span> - <span id="lblEndTime">9:00 PM</span>
                </p>
                <p>
                    <label>Time Zone:</label><span id="lblTimeZone">Eastern</span>

                </p>
                <p>
                    <label>Description:</label><span id="lblDesc" class="fieldData long">The American Cancer Society Walter Hagen Golf Tournament highlights the Society’s role in supporting research and patient care here in Rochester. Funds raised through this event help us make a difference in patents’ lives every day though programs including Road to Recovery and Patient Navigation as well as support grants to our research institutions.  144 golfers will play a round of golf and then enjoy cocktails, dinner, and silent auction following the tournament. </span>
                </p>
                <p>
                    <label>Agenda:</label><span id="lblAgenda" class="fieldData long">10:00am - Check-in, 11:00am - Lunch, 12:15pm - Shot gun start, 6:00 - Cocktails and silent auction, 7:00pm Dinner and program</span>
                </p>

            </div>
        </div>

        <div id="pnlStandardDisplay">


        <!-- Event Location Box -->
        <div class="text-box boxed wide line">
            <h3 class="head" style="width:97%;">
                Event Location
            </h3>
            <div class="content" style="display:inline-block; width:97%;">


                <div >
                    <div id="mapOutsideContainer" class="resource-map">
                       <div id="map_canvas" class="resource-map" ></div>
                    </div> 
                    <script  type="text/javascript">
                        var mapDataPoints = [{ "lat":43.1075545,"lng":-77.5164518, "title":"Golf Event","content":"<b>American Cancer Society 44th Annual Walter Hagen Golf Tournament<\/b><br/><\/br>4045 East Avenue<br /><br/>Rochester, New York  14618<br /><br />Phone: <br />Fax: "} ];
                        buildMap(mapDataPoints, -5);
                    </script>
                </div>

                <h4><span id="lblLocationName">Irondequoit Country Club</span></h4>
                <p>

                    <label>Address:</label><span id="lblAddress" class="fieldData" style="width:150px;">4045 East Avenue<br />Rochester, New York 14618</span>
                </p>
                <p>
                    <label nowrap="nowrap">Handicap Accessible:</label><span id="lblHandicapAccesible">Yes</span>
                </p>
            </div>

        </div>

        <!-- Primary Contact Box -->
        <div class ="line" >
        <div id="eventPrimaryContact_divContact" class="text-box boxed wide">
                    <h3 class="head" style="width:97%;">
                        Primary Contact
                    </h3>
                    <div class="content">

                        <p>

                            <label>Contact:</label><span id="eventPrimaryContact_lblContact">Katerina Kormas (<a href="mailto:[email protected]?subject=American Cancer Society 44th Annual Walter Hagen Golf Tournament">Contact ACS for Details</a>)</span>

                        </p>
                        <p>
                            <label>Contact Type:</label><span id="eventPrimaryContact_lblContactType">ACS Staff</span>
                        </p>
                        <p>

                            <label>Phone:</label><span id="eventPrimaryContact_lblContactPhone">(585) 288-1950</span>
                        </p>
                        <p>
                            <label>Additional Information:</label><span id="eventPrimaryContact_lblContactAddlInfo" class="fieldData long">Direct line is 585-224-4919 or cell 585-645-8912</span>
                        </p>
                    </div>
                </div>

        </div>

        <!-- Registration Information Box -->

        <div class="text-box boxed wide line">
            <h3 class="head" style="width:97%;">
                Registration Information
            </h3>
            <div class="content">

                <p>
                    <label nowrap="nowrap">Registration Required?: </label><span id="lblRegRequired">Yes</span>

                </p>
            </div>
        </div>       

        <!-- Event Cost Box -->
        <div class ="line" >
        <div id="eventCost_divCost" class="text-box boxed wide">
                    <h3 class="head" style="width:97%;">
                        Event Cost
                    </h3>
                    <div class="content">

                        <p>
                            <label>Cost/Registration Fee: </label><span id="eventCost_lblCostRegFee" class="fieldData long">$350 per golfer</span>
                        </p>
                        <p>
                            <label>Payment Type: </label><span id="eventCost_lblPaymentTypes" class="fieldData">Cash, Check, American Express, Mastercard, Visa, Discover</span>
                        </p>
                        <p>

                            <label>Check Payable To: </label><span id="eventCost_lblCheckPayable" class="fieldData">American Cancer Society</span>
                        </p>
                        <p>
                            <label>Memo Line: </label><span id="eventCost_lblCheckMemo" class="fieldData">American Cancer Society 44th Annual Walter Hagen Golf Tourna</span>
                        </p>
                        <p>
                            <label>Mail Check To:</label><span id="eventCost_lblCheckMailTo" class="fieldData">American Cancer Society<br />1120 South Goodman St<br />Rochester, New York 14620</span>

                        </p>
                    </div>
                </div>

        </div>

        <!-- Tax Deduction Information Box -->
        <div class="line">

                <div class="text-box boxed wide">
                    <h3 class="head" style="width:97%;">
                        Tax Deduction Information
                    </h3>

                    <div class="content">
                        <p>
                            $210  per golfer is tax deductible
                        </p>
                    </div>
                </div>  

        </div>



</div> <!-- end standard display -->
         <!-- end daffodil display -->

EDIT: Compte tenu de ces nouvelles tables, je voudrais extraire les informations générales et l'emplacement de l'événement. Comment pourrais-je procéder? Peut-être en utilisant le sous-ensemble de sélectionner, je viens de sélectionner à nouveau Où les en-têtes sont ce que je veux?

Le code où j'utilise le select () est indiqué ci-dessous. Comme je l'ai déjà dit, j'ai essayé d'utiliser

select("div[id=pnlResults]);

mais les données retournées sont bien plus que la div où l'id est pnlResults.

public ArrayList<Event> results()
{
    ArrayList<Event> results = new ArrayList<Event>();
    Document doc = Jsoup.parse(page);
    Elements links = doc.select("a[href*=event-details]");

    for(Element e: links)
    {
        String title = e.text();
        String link = "http://www.cancer.org/involved/participate/app/"+e.attr("href");
        try{
            Document eventInfo = Jsoup.connect(link).get();
            Elements info = eventInfo.select("div[id*=pnlResults");


        }
        catch(MalformedURLException exception)
        {
            exception.printStackTrace();
        }
        catch(IOException exception)
        {
            exception.printStackTrace();
        }

    }
    return results;
}

Toute aide serait grandement appréciée.

23
Tom

Essayer:

 Elements info = eventInfo.select("div#pnlResults");

Mise à jour pour votre mise à jour:

Puisque vous avez maintenant plus de données et que le HTML lui-même n'est pas si bon, vous devrez simplement le parcourir pour sélectionner vos données. Si le contenu dont vous avez besoin a tous des valeurs id, utilisez l'attribut id de ces éléments pour obtenir le texte.

37
C0deAttack

Si vous voulez obtenir le contenu de la div avec l'ID "pnlResults", JSoup fournit une méthode getElementById.

Par exemple, si vous voulez obtenir ce contenu et le mettre en chaîne, vous pouvez le faire comme ceci:

Document document = Jsoup.connect(LINK_TO_WEBSITE).get();
String content = document.getElementById("pnlResults").outerHtml();

Ensuite, vous pouvez mettre ce contenu dans WebView d'Android, et cela fonctionnera bien.

J'espère que cela aidera quelqu'un!

6
akelec

Cela a fonctionné pour moi:

import Java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class DivStuff {
   public static final String MY_PAGE = "http://www.cancer.org/Involved/Participate/app" +
        "/event-search.aspx?zip=28590&city=&state=&local-radius=20&textsrch=&startdate=" +
        "11%2F13%2F2011&enddate=&all=1";
   private static final String[] HEADINGS = {"Event", "Location", "City, State", "Date", "Distance"};
   private String page;


   public static void main(String[] args) throws IOException {
      Document doc = Jsoup.connect(MY_PAGE).get();

      Elements links = doc.select("table");
      Elements links2 = links.select("tr");

      if (links2.size() < 2) {
         return;
      }

      for (int i = 1; i < links2.size(); i++) {
         Elements innerDetails = links2.get(i).select("td");
         if (innerDetails.size() != 5) {
            break;
         }
         for (int j = 0; j < HEADINGS.length; j++) {
            System.out.print(HEADINGS[j] + ": ");
            if (j == 0) {
               System.out.println(innerDetails.get(j).select("a").get(0).text());
            } else {
               System.out.println(innerDetails.get(j).text());
            }
         }
         System.out.println();
      }
   }
}