Улучшенное использование HTML Agility Pack

html-agility-pack screen-scraping

Вопрос

Я довольно новичок в HTML Agility Pack, поэтому мне нужна помощь в том, куда идти дальше. Я могу сделать некоторые простые вещи, такие как вытащить значение из href (зная строку url, которую я искал), и я могу тянуть, как значение в диапазоне, на основе определенного класса, который использовался. Но я не понимаю, как использовать 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

Принятый ответ

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

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

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



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow