extraer datos de pagina con file_get_contents

Iniciado por kanser, 17 Noviembre 2011, 08:27 AM

0 Miembros y 1 Visitante están viendo este tema.

kanser

hola tengo que extraer datos de una pagina web

quiero extraer contenido del archivo con file_get_contents.

Luego, cortar el contenido con combinaciones de substr/strpos pero no se como hacerle
y el contenido cortado pues ya lo meto en variables para su uso


<table class="TextoGeneral" align="CENTER" border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody><tr class="TextoGeneralRojomedium">
<td colspan="6"><b>
</b></td>
</tr>
<tr>
<td class="FormTitulo" align="CENTER" width="8%">Remover</td>

<td class="FormTitulo" align="CENTER" width="8%">Cantidad</td>

     <td class="FormTitulo" align="LEFT" width="25%">&nbsp;Descripción
       del Producto</td>
<td class="FormTitulo" align="CENTER" width="15%">ID Producto</td>
<td class="FormTitulo" align="CENTER" width="15%">Precio Unitario</td>
<td class="FormTitulo" align="CENTER" width="15%">Precio Total</td>
</tr>

<tr>

<td class="TextoGeneralTabla" align="CENTER" width="8%"><input name="Check" value="Producto 3" type="radio"></td>
<td class="TextoGeneralTabla" align="CENTER" width="8%"><input maxlength="3" onkeypress="SoloNumerico();" class="FormCasillas" size="1" name="Change120088Producto0" value="7" type="text"></td>
<td class="TextoGeneralTabla" align="CENTER" width="25%">Producto 3</td>
<td class="TextoGeneralTabla" align="CENTER" width="15%">-</td>
<td class="TextoGeneralTabla" align="RIGHT" width="15%">

$ <input name="TipoMonedaProducto 3" value="1" type="hidden">
89,076.00&nbsp;&nbsp;&nbsp;</td>

<td class="TextoGeneralTabla" align="RIGHT" width="15%">


$
623,532.00&nbsp;&nbsp;&nbsp;</td>

</tr>
<tr>

<td class="TextoGeneralTabla" align="CENTER" width="8%"><input name="Check" value="Producto 2" type="radio"></td>
<td class="TextoGeneralTabla" align="CENTER" width="8%"><input maxlength="3" onkeypress="SoloNumerico();" class="FormCasillas" size="1" name="Change120088Producto1" value="6" type="text"></td>
<td class="TextoGeneralTabla" align="CENTER" width="25%">Producto 2</td>
<td class="TextoGeneralTabla" align="CENTER" width="15%">-</td>
<td class="TextoGeneralTabla" align="RIGHT" width="15%">

$ <input name="TipoMonedaProducto 2" value="1" type="hidden">

700.00&nbsp;&nbsp;&nbsp;</td>

<td class="TextoGeneralTabla" align="RIGHT" width="15%">

$
4,200.00&nbsp;&nbsp;&nbsp;</td>

</tr>
<tr>

<td colspan="5" class="TextoGeneralTabla" align="RIGHT" width="55%"><b>Total&nbsp;&nbsp;&nbsp;</b></td>
<td class="TextoGeneralTabla" align="right" width="15%"><b>

$
627,732.00&nbsp;&nbsp;&nbsp;</b></td>

</tr>
</tbody></table>


de aqui de este codigo me gustaria extraer el 7 de <input maxlength="3" onkeypress="SoloNumerico();" class="FormCasillas" size="1" name="Change120088Producto0" value="7" type="text">

el 6 de <input maxlength="3" onkeypress="SoloNumerico();" class="FormCasillas" size="1" name="Change120088Producto1" value="6" type="text">

o mejor dicho el value de cada <input maxlength="3" onkeypress="SoloNumerico();" class="FormCasillas" size="1" name="Change120088Producto1" value="NUMERO A OBTENER" type="text">

y por ultimo 627,732.00 o el numero que este ahi
<td class="TextoGeneralTabla" align="right" width="15%"><b>

$
627,732.00&nbsp;&nbsp;&nbsp;</b></td>


no tengo ni idea por donde va pero tengo lo siguiente:

   $url = file_get_contents('url');
               $patron = '|value=(.*?)" type="text">|is';
               $extracto = '';
               if (preg_match($patron, $source, $extracto1))
               {
                   $extracto = $extracto1[1];
               }
               echo $extracto


como ven ojala ayuden con mis dudad
prefiero amigos que comparten lo poco que saben, que amigos que saben todo y no comparten nada

~ Yoya ~

Lo que instentas hacer, es una tecnica llamada  Data Mining.

Cita de: wikipediaLa minería de datos (DM, Data Mining) consiste en la extracción no trivial de información que reside de manera implícita en los datos. Dicha información era previamente desconocida y podrá resultar útil para algún proceso. En otras palabras, la minería de datos prepara, sondea y explora los datos para sacar la información oculta en ellos.

Si vas a hacer este tipos de cosas es mejor que desde el principio pienses en dejar de utilizar substr/strpos. Para esto se utiliza Expresiones Regulares, lee sobre ello luego intenta utilizarla, si tienes alguna duda sobre las expresiones regulares te la puedo contestar.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

madpitbull_99




«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

~ Yoya ~

Cita de: madpitbull_99 en 17 Noviembre 2011, 16:29 PM
O puedes parsear HTML con alguna librería.

Parsear HTML con PHP – Simple HTML DOM Parser

Quizás pero no creo que sea el mejor método aunque quizás es mucho mas fácil que intentar entender las expresiones regulares, bueno la librería también utiliza expresiones regulares para poder parsear el código HTML.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

h3ct0r

Es una mejor idea usar ya de facto un parseador de HTML que ya tenga las rutinas mas optimas y las mejores expresiones regulares para realizar esa accion.

Y de ahi solo tomas los datos que necesites y los validas segun tus requerimientos.

Eso es mas comodo, optimo y seguro que crearte miles de expresiones regulares con las que vas a tener que validar muchisimas variantes si esperas que ese texto cambie su formato con regularidad.

De todas maneras por ahi hay tutoriales de exp regulares, es algo muy sencillo de aprender y generalmente util, pero hay que saber cuando usarlas y cuando no.
[img[/img]

~ Yoya ~

@h3ct0r en realidad estas equivocado si usas dicho parser puede estar perdiendo performance innecesario, con un solo patrón se puede capturar todo los datos que dice @kanser.

Cita de: h3ct0r en 17 Noviembre 2011, 19:51 PM
Un parseador de HTML que ya tenga las rutinas mas optimas y las mejores expresiones regulares para realizar esa accion.

Las mejores expresiones regulares es muy dudoso, hay muchas formas de realizar un patrón que realice lo mismo pero la diferencia es que algunas tienen mucho mas eficientes que otras. También tienes que validar correctamente el texto xD.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

h3ct0r

Hay que realizar siempre acciones que tengan escalabilidad rapida y eficiente. Hacer microoptimizaciones totalmente dependientes de una sola estructura de datos no es siempre la mejor idea.

En cambio, tomar un parser bueno y comprobado por la comunidad como un producto de calidad, es mucho mejor que empezar a filtrar el texto con expresiones regulares propias una a una.

Imaginate si se anaden mas lineas de texto o si se cambian de posicion las etiquetas con algun espacio o letra de mas, ya con una expresion regular comun tendrias problemas si no calculaste esas variantes, con el parser HTML ya no tanto.

Hay que ver tambien el caso de que generalmente se quieran buscar mas datos, tendria que hacer mas expresiones regulares y leer linea por linea igual. Yo preferiria tener todo ese HTML dentro de una estructura de datos que me permita buscar facilmente cualquier informacion una vez parseada.

Aunque tu punto de vista es valido. Si solo se va a buscar esa pequena cantidad de texto y se sabe que sera solo esa en un futuro, usar solo expresion regular con lectura linea a linea del texto no va a tener problema. :xD

Y hay que validar el texto!
Cita de: h3ct0r en 17 Noviembre 2011, 19:51 PM
Y de ahi solo tomas los datos que necesites y los validas segun tus requerimientos.
[img[/img]

~ Yoya ~

#7
A todas las opciones que dijiste, a todo eso yo puedo hacerlo con 1 sola expresión regular,puedo hacer lo que haces con 10 expresiones regulares hacerlo con solo 1, puede que sea 10 o mas veces que el texto pueda variar. No lo digo porque sea el mejor con expresiones regulares o porque haga magia, sino porque todo eso es posible hacerlo con solo 1 expresión regular.

Buscas acciones rápida, entonce haz todo con una sola expresión regular y ahorrate tiempo en buscar algún parser y luego leer la documentación.

Desde 1 expresión regular, puedes filtrar, capturar, reemplazar,verificar y hasta hacer que el patrón tome diferente decisiones en diferente casos.

Lo que te lo digo te lo digo a base de experiencia, tengo años parseando datos ya que suelo crear App para sitios y mucho de ellos no tienen una API y tengo que hacer todo manualmente.

En varios proyectos he utilizado librerías pero todas son miás exceptos algunas que no necesariamente si la realizo la haré mejor porque dará lo mismo. La razón es porque es lo que busco exactamente y lo haría exactamente igual si no la usara.

Igual estoy en contra de re-inventar la rueda pero aveces es mucho mejor reinventar la rueda como dicen (no estoy seguro que es exactamente asi xD): Solo vale la pena re-inventar la ruedas para hacer ruedas mejores.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

h3ct0r

Deberias hacer un tutorial de regexp aver que tal, en php o en el lenguaje que tu quieras.

No creo que realmente puedas hacer todo lo que yo te dije con una sola expresion regular sin hacer un mounstro gigante complicado y probablemente dificil de hacer mantenimiento. (Que es algo que hay que tomar en cuenta cuando se trabaja en equipo, en algun proyecto serio, con vias a escalabilidad).

Yo tambien hago bastante data mining y te digo, entre una optimizacion pequena vs mantenimiento entendible y comodo, escojo el mantenimiento.

Y hay viene el mismo tema de las microoptimizaciones, mi recomendacion es el parser.

Mis 2 centavos.
[img[/img]

~ Yoya ~

Ps como te dije, lo puedo hacer porque es posible.

Todo lo que haces con el parser lo puedes hacer con expresiones regulares pero no todo lo que haces con expresiones regulares lo puedes hacer con el parser.

No hay ningún monstruo complicado ni gigante si entiendes cada parte.

Igual no se pierde tiempo creando un patron, si tienes experiencia sabrás como hacerlo desde el primer instante.

Con el tema de microoptimizaciones lol, supongo que sera cuando vez algún framework lo ultimo que te interesas es el rendimiento de este xD. No sabes la cantidad de PC viejas que utilizan muchas personas como server y reciben miles de visitas diarias y de esas "microoptimizaciones" hace que el servidor no se sobre-carge.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.