Uso avanzado de HTML Agility Pack

html-agility-pack screen-scraping

Pregunta

Soy bastante nuevo en el HTML Agility Pack, por lo que necesito ayuda para saber a dónde ir a continuación. Puedo hacer algunas cosas simples como extraer un valor de un href (sabiendo la cadena de URL que estaba buscando) y puedo extraer el valor en un intervalo basado en una clase específica que se estaba utilizando. ¿Pero no entiendo cómo usar el paquete de agilidad HTML en una situación en la que hay una tonelada de o etiquetas y un trío no es un ancla sólida real a la que atar?

Aquí hay una porción real de código que estoy raspando. Coloqué datos ficticios en las celdas para demostrar lo que estoy buscando.

¿Cuál es la mejor manera de extraer lo siguiente: 1.) Nombre de la empresa? 2.) ¿Número de teléfono? 3.) Dirección de correo electrónico?

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>

.... Más HTML

Respuesta aceptada

Bueno, tienes que entender XPATH para realmente aprovechar las capacidades de raspado del paquete de agilidad HTML :-) Puedes comenzar a buscar en Google "ejemplos de XPATH".

Centrándose en la pregunta sobre el raspado de la pantalla, la parte difícil es seleccionar cuál es la expresión xpath más discriminatoria para la información que desea obtener. La mayoría de las veces, no hay una sola solución, y debe estar preparado para actualizar su código para mantener la evolución HTML del sitio de destino.

Así que es un intercambio entre expresiones muy simples con el riesgo de que coincidan con textos no deseados, y expresiones demasiado discriminantes, no tolerantes con las evoluciones en el código HTML raspado, con el riesgo de que no coincidan con nada.

En cuanto a su texto específico, este es un buen ejemplo del mundo real, y aquí hay un código que lo hace:

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);

PD : tenga en cuenta que el paquete de agilidad HTML siempre espera que las etiquetas utilizadas en las expresiones XPATH sean minúsculas, incluso si no están en el texto HTML original.

Como ve, el nombre de la empresa se recupera aquí usando dos expresiones diferentes. Ambos trabajan en la muestra, pero el primero no se resistirá si se agrega una nueva etiqueta en cualquier lugar en el medio. El segundo es más seguro para el futuro, pero se basa en una etiqueta de clase CSS que también puede cambiar. Siempre es una compensación.

El número de teléfono y el correo electrónico son similares pero muestran el poder de XPATH.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué