2011-01-05 4 views
1

Ich bin ziemlich neu in das HTML-Agility-Pack so brauche ich etwas Hilfe mit dem nächsten gehen. Ich kann einige einfache Dinge tun, wie z. B. einen Wert aus einem href ziehen (kenne die URL-Zeichenkette, nach der ich gesucht habe), und ich kann wie der Wert in einem Bereich basierend auf einer bestimmten Klasse ziehen, die verwendet wurde. Aber ich verstehe nicht, wie man das HTML Agility Pack in einer Situation benutzt, in der es eine Tonne oder Tags gibt, an die man nicht wirklich gebunden ist?Advanced HTML Agility Pack-useage

Hier ist ein tatsächliches Stück Code ich durch bin Schaben. Ich platzierte Dummy-Daten in den Zellen, um zu demonstrieren, wonach ich suche.

Was ist der beste Weg, die folgenden zu extrahieren: 1.) Name des Unternehmens? 2.) Telefonnummer? 3.) E-Mail Adresse?

HTML ....

<td> 
    <!-- Company Info --> 
    <table cellpadding="0" cellspacing="0" border="0"> 
     <tr> 
      <td class="black"> 
       <table cellspacing="1" cellpadding="0" border="0" width="370"> 
        <tr> 

         <th>COMPANY NAME</th> 
        </tr> 
        <tr> 
         <td class="search"> 

          <table cellpadding="5" cellspacing="0" border="0" width="100%"> 
           <tr> 
            <td> 
             <table cellpadding="1" cellspacing="0" border="0" width="100%"> 

              <tr> 
              <td colspan="2" align="center">Un-needed Links...</td> 
              </tr> 
              <tr> 
               <td align="center" colspan="2"><hr></td> 

              </tr> 
              <tr> 
               <td align="right" nowrap><b><font color="FF0000">Contact Person&nbsp;<img src="/images/icon_contact.gif" align="absmiddle">&nbsp;:</font></b></td> 
               <td align="left" width="100%">&nbsp;Judy Smith</td> 
              </tr> 
              <tr> 
               <td align="right" nowrap><b><font color="FF0000">Phone Number&nbsp;<img src="/images/icon_phone.gif" align="absmiddle">&nbsp;:</font></b></td> 

               <td align="left" width="100%">&nbsp;555-555-5555</td> 
              </tr> 

              <tr> 
               <td align="right" nowrap><b><font color="FF0000">E-mail Address&nbsp;<img src="/images/icon_email.gif" align="absmiddle">&nbsp;:</font></b></td> 
               <td align="left" width="100%">&nbsp;<a HREF="mailto:[email protected]">[email protected]</a></td> 
              </tr> 
              <tr> 

               <td align="center" colspan="2"><hr></td> 
              </tr> 
              <tr> 
               <td align="right" nowrap><b><font color="FF0000">Home Office Location&nbsp;<img src="/images/icon_home.gif" align="absmiddle">&nbsp;:</font></b></td> 
               <td align="left" width="100%">&nbsp;ATLANTA, GA</td> 
              </tr> 
              <tr> 

               <td align="right" nowrap><b><font color="FF0000">Home Office Phone&nbsp;<img src="/images/icon_home.gif" align="absmiddle">&nbsp;:</font></b></td> 
               <td align="left" width="100%">&nbsp;555-555-5555</td> 
              </tr> 
              <tr> 
               <td align="right" nowrap><b><font color="FF0000">Home Office Fax&nbsp;<img src="/images/icon_home.gif" align="absmiddle">&nbsp;:</font></b></td> 
               <td align="left" width="100%">&nbsp;666-666-6666</td> 

              </tr> 
              <tr> 
               <td align="center" colspan="2"><hr></td> 
              </tr> 
              <tr> 
               <td align="right" nowrap><b><font color="FF0000">Broker MC Number&nbsp;<img src="/images/icon_number.gif" align="absmiddle">&nbsp;:</font></b></td> 
               <td align="left" width="100%">&nbsp;123456</td> 

              </tr> 
              <tr> 
               <td align="right" nowrap><b><font color="FF0000">Carrier MC Number&nbsp;<img src="/images/icon_number.gif" align="absmiddle">&nbsp;:</font></b></td> 
               <td align="left" width="100%">&nbsp;654321</td> 
              </tr> 

             </table> 
            </td> 

           </tr> 
          </table> 
         </td> 
        </tr> 
       </table> 
      </td> 
     </tr> 
    </table> 
    <br> 

    <!-- Starting Point --> 
    <table cellpadding="0" cellspacing="0" border="0"> 
     <tr> 
      <td class="black"> 
       <table cellspacing="1" cellpadding="0" border="0" width="370"> 
        <tr> 
         <th>Starting Point</th> 
         <th>Available</th> 

        </tr> 
        <tr> 
         <td class="search" width="270">&nbsp;<b>ABBEVILLE, GA&nbsp;</b></td> 
         <td class="search" align="center" width="100"><span style="color: forestgreen">&nbsp;1/5/11&nbsp;</span></td> 
        </tr> 
       </table> 
      </td> 
     </tr> 

    </table> 
    <br> 
    <!-- Destination Point --> 
    <table cellpadding="0" cellspacing="0" border="0"> 
     <tr> 
      <td class="black"> 
       <table cellspacing="1" cellpadding="0" border="0" width="370"> 
        <tr> 
         <th>Destination Point</th> 

         <th>Direction</th> 
        </tr> 
        <tr> 
         <td class="search" width="270">&nbsp;<b>ATLANTA, GA&nbsp;</b></td> 
         <td class="search" align="center" width="100"><span style="color: FF0000">&nbsp;&nbsp;</span></td> 
        </tr> 
       </table> 
      </td> 

     </tr> 
    </table> 
    <br> 
    <!-- Truck Details --> 
    <table cellpadding="0" cellspacing="0" border="0"> 
     <tr> 
      <td class="black"> 
       <table cellspacing="1" cellpadding="0" border="0" width="370"> 
        <tr> 

         <th>Truck Details</th> 
        </tr> 
        <tr> 
         <td class="search"> 
          <table cellpadding="5" cellspacing="0" border="0"> 
           <tr> 
            <td> 
             <table cellpadding="0" cellspacing="0" border="0"> 

              <tr> 
               <td align="right"><b>Date Posted&nbsp;:</b></td> 
               <td align="left">&nbsp;&nbsp;1/5/2011 10:34:48 AM</td> 
              </tr> 
              <tr> 
               <td align="right"><b>Quantity&nbsp;:</b></td> 

               <td align="left">&nbsp;&nbsp;1</td> 
              </tr> 
              <tr> 
               <td align="right"><b>Equipment Type&nbsp;:</b></td> 
               <td align="left">&nbsp;&nbsp;FT</td> 
              </tr> 
              <tr> 

               <td align="right"><b>Load Size&nbsp;:</b></td> 
               <td align="left">&nbsp;&nbsp;Full</td> 
              </tr> 
              <tr> 
               <td align="right" valign="top"><b>Special Information&nbsp;:</b></td> 
               <td align="left">&nbsp;&nbsp;</td> 

              </tr> 
             </table> 
            </td> 
           </tr> 
          </table> 
         </td> 
        </tr> 
       </table> 
      </td> 

     </tr> 
    </table> 
    <br> 
</td> 

.... Mehr HTML

Antwort

4

Nun, müssen Sie XPATH verstehen wirklich advandage des HTML-Agilität Packung nehmen Fähigkeiten Schaben :-) Sie können Google auf "XPATH Beispiele", um mit zu beginnen.

Fokussierung auf den Screen-Scraping Frage, ist der schwierige Teil zu wählen, was Sie denken die meisten Diskriminante XPath-Ausdruck für die Informationen, die Sie erhalten möchten. In den meisten Fällen gibt es nicht nur eine Lösung, und Sie müssen darauf vorbereitet sein, Ihren Code zu aktualisieren, damit er bei der HTML-Entwicklung der Zielwebsite bleibt.

Es ist also ein Kompromiss zwischen sehr einfachen Ausdrücken mit dem Risiko, dass sie unerwünschten Texten entsprechen und zu diskriminierenden Ausdrücken, nicht tolerant gegenüber Entwicklungen im gescannten HTML, mit dem Risiko, dass sie nichts erreichen.

Wie für Ihren spezifischen Text, ist dies ein gutes reale Welt Beispiel, und hier ist ein Code, der tut es:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(yourText); 

string companyName = doc.DocumentNode.SelectSingleNode("/td/table/tr/td/table/tr/th").InnerText; 
Console.WriteLine("company name=" + companyName); 

// another way 
companyName = doc.DocumentNode.SelectSingleNode("//td[@class='black']/table/tr/th").InnerText; 
Console.WriteLine("company name=" + companyName); 

// a more advanced XPATH expression, means 
// "Select a TD tag anywhere in the doc that has a preceding sibling of TD type with a B chid, with a FONT child with inner text starting with 'Phone Number'" 
string phoneNumber = doc.DocumentNode.SelectSingleNode("//td[starts-with(preceding-sibling::td/b/font/text(), 'Phone Number')]").InnerText; 
Console.WriteLine("phone Number=" + phoneNumber); 

// same kind of story but go down the next A tag 
string email = doc.DocumentNode.SelectSingleNode("//td[starts-with(preceding-sibling::td/b/font/text(), 'E-mail')]/a").InnerText; 
Console.WriteLine("email=" + email); 

PS: bitte Tags in XPATH verwendete immer erwartet, dass das HTML Agility Pack Hinweis Ausdrücke in Kleinbuchstaben, auch wenn sie nicht im ursprünglichen HTML-Text enthalten sind. mit zwei verschiedenen Ausdrücken

Wie man sieht, wird der Firmenname hier abgerufen werden. Beide arbeiten an der Probe, aber die erste wird nicht widerstehen, wenn irgendwo in der Mitte ein neues Tag hinzugefügt wird. Der zweite ist zukunftssicherer, basiert aber auf einem CSS-Klassen-Tag, das sich ebenfalls ändern kann. Es ist immer ein Kompromiss.

Die Telefonnummer & E-Mail sind ähnlich, aber zeigt die Macht des XPATH.

+0

Das ist eine enorme Antwort. Vielen Dank für die vielen Beispiele. – WildBill

Verwandte Themen