2011-01-05 88 views
1

我非常新的HTML敏捷性包,所以我需要一些幫助,下一步去哪裏。我可以做一些簡單的事情,比如從href中獲取一個值(知道我正在查找的url字符串),並且可以像基於正在使用的特定類的跨度中的值一樣拉動。但是我不明白如何在一個或多個標籤中使用HTML Agility Pack,而不是一個真正的固定錨?高級HTML敏捷性包使用率

這裏是代碼的實際塊我刮通過。我在單元格中放置了虛擬數據以展示我在尋找的內容。

什麼是提取以下的最佳方式:1。 )公司名稱? 2.)電話號碼? 3.)電子郵件地址?

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> 

....更多HTML

回答

4

好了,你要明白XPATH真正採取advandage的HTML敏捷性包刮能力:-)你可以在google的在「XPATH示例」上開始。

着眼於屏幕抓取問題,棘手的部分是選擇你認爲是你想要得到的信息是最判別XPath表達式。大多數時候,不僅有一種解決方案,而且您必須準備更新您的代碼以堅持目標網站HTML演進。

因此,這是一種非常簡單的表達式之間的權衡,它們存在匹配不想要的文本和過分判別表達式的風險,不能容忍被刮掉的HTML中的進化,並且存在風險,即它們什麼都不匹配。

至於你具體的文字,這是一個很好的現實世界的例子,這裏是做一個代碼是:

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:請注意HTML敏捷性包總是期待在XPATH使用的標籤表達式爲小寫,即使它們不在原始HTML文本中。

如您所見,公司名稱在這裏使用兩種不同的表達式進行檢索。他們都在樣本上工作,但如果在中間的任何地方添加新標籤,第一個標籤不會抵制。第二個更具前瞻性,但是基於也可能改變的CSS類標籤。這總是一個折衷。

電話號碼&電子郵件是相似的,但顯示XPATH的力量。

+0

這是一個巨大的答案。非常感謝多個例子。 – WildBill 2011-01-06 15:29:25