Расширенное использование HTML Agility Pack - PullRequest
2 голосов
/ 05 января 2011

Я довольно плохо знаком с HTML Agility Pack, поэтому мне нужна помощь с тем, куда идти дальше.Я могу сделать несколько простых вещей, таких как извлечение значения из href (зная искомую строку URL), и я могу вытащить, как значение в span, основываясь на конкретном используемом классе.Но я не понимаю, как использовать HTML Agility Pack в ситуации, когда существует множество тэгов или тегов, к которым нельзя привязаться?

Вот реальный кусок кода, которым я являюсьсоскоб.Я поместил фиктивные данные в ячейки, чтобы продемонстрировать, что я ищу.

Как лучше всего извлечь следующее:

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:judy.smith@companyname.com">judy.smith@companyname.com</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

1 Ответ

5 голосов
/ 06 января 2011

Что ж, вы должны понимать XPATH, чтобы по-настоящему осваивать возможности очистки HTML-пакетов Agility Pack :-) Можно начать с 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-пакет Agility Pack всегда ожидает, что теги, используемые в выражениях XPATH, должны быть строчными, даже если их нет в исходном тексте HTML.

Как видите, название компании извлекается здесь с использованием двух разных выражений.Они оба работают с образцом, но первый не будет сопротивляться, если в середине будет добавлен новый тег.Второй более перспективен на будущее, но основан на теге класса CSS, который также может измениться.Это всегда компромисс.

Номер телефона и адрес электронной почты похожи, но показывают мощь XPATH.

...