Pacchetto avanzato di HTML Agility Pack

html-agility-pack screen-scraping

Domanda

Sono abbastanza nuovo per l'HTML Agility Pack, quindi ho bisogno di aiuto con dove andare dopo. Posso fare alcune cose semplici come tirare un valore da un href (conoscendo la stringa url che stavo cercando) e posso tirare come il valore in un intervallo basato su una classe specifica che era in uso. Ma non capisco come usare l'HTML Agility Pack in una situazione in cui ci sono una tonnellata di tag o un thre non è una vera e solida ancora da legare a?

Ecco un vero pezzo di codice che sto esaminando. Ho inserito dati fittizi nelle celle per dimostrare quello che sto cercando.

Qual è il modo migliore per estrarre quanto segue: 1.) Nome dell'azienda? 2.) Numero di telefono? 3.) Indirizzo email?

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>

.... Più HTML

Risposta accettata

Bene, devi capire XPATH per sfruttare davvero le funzionalità di scraping del pacchetto di agilità HTML :-) Puoi iniziare con google su "XPATH examples".

Concentrandosi sulla domanda di raschia schermo, la parte più difficile è selezionare quella che pensi sia l'espressione xpath più discriminante per le informazioni che vuoi ottenere. La maggior parte delle volte, non c'è solo una soluzione e devi essere pronto ad aggiornare il tuo codice per rispettare l'evoluzione HTML del sito di destinazione.

Quindi si tratta di un compromesso tra espressioni molto semplici con il rischio che corrispondano a testi indesiderati e espressioni troppo discriminanti, non tolleranti con le evoluzioni nell'HTML graffiato, con il rischio che non corrispondano a nulla.

Per quanto riguarda il tuo testo specifico, questo è un buon esempio del mondo reale, e qui c'è un codice che lo fa:

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 : si noti che HTML Agility Pack si aspetta sempre che i tag utilizzati nelle espressioni XPATH siano in minuscolo, anche se non si trovano nel testo HTML originale.

Come vedi, il nome dell'azienda viene recuperato qui utilizzando due espressioni diverse. Entrambi lavorano sul campione, ma il primo non resisterà se un nuovo tag viene aggiunto da qualche parte nel mezzo. Il secondo è più a prova di futuro, ma si basa su un tag di classe CSS che potrebbe anche cambiare. È sempre un compromesso.

Il numero di telefono e l'e-mail sono simili ma mostrano la potenza di XPATH.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché