2010-04-13 12 views
6

Nuestra base de datos está llena de artículos recuperados de fuentes RSS. No estaba seguro de qué datos recibiría, y de cuánto filtrado ya estaba configurado (complemento WP-O-Matic Wordpress utilizando la biblioteca SimplePie). Este complemento hace una codificación básica antes de la inserción usando la función de inserción de publicaciones incorporada de Wordpress, que también hace algunos filtros. Entre la codificación de la fuente RSS, la codificación del plugin usando PHP, la codificación de Wordpress y el escape de SQL, no estoy seguro por dónde empezar.¿Qué debo usar para eliminar html escapado de grandes conjuntos de datos?

Los datos suelen estar al final del campo después del contenido que quiero conservar. Es todo en una línea, pero separados a cabo para facilitar la lectura:

<img src="http://feeds.feedburner.com/~ff/SoundOnTheSound?i=xFxEpT2Add0:xFbIkwGc-fk:V_sGLiPBpWU" border="0"></img>

<img src="http://feeds.feedburner.com/~ff/SoundOnTheSound?d=qj6IDK7rITs" border="0"></img>

&lt;img src=&quot;http://feeds.feedburner.com/~ff/SoundOnTheSound?i=xFxEpT2Add0:xFbIkwGc-fk:D7DqB2pKExk&quot;

Aviso cómo algunas de las imágenes son de escape y algunos no lo son. Creo que esto tiene que ver con la última parte cortada para ser irreconocible como una etiqueta html, que luego causó que se html endcoded mientras que las etiquetas img reales se quedaron solos.

Otro registro tiene única esto en uno de los campos, lo que significa la fuente RSS me dio nada por el elemento (filtrada a cabo ahora, pero tengo un montón de discos como este):

&lt;img src=&quot;http://farm3.static.flickr.com/2183/2289902369_1d95bcdb85.jpg&quot; alt=&quot;post_img&quot; width=&quot;80&quot;

Todas las muestras extraídas están en una línea, pero están rotas para facilitar su lectura. De lo contrario, se copian exactamente desde la base de datos desde la línea de comandos del cliente mysql.

Pregunta: ¿Cuál es la mejor manera de trabajar con lo anterior escapado html (o parte de una etiqueta HTML), por lo que puede entonces y eliminar sin afectar el contenido?

Quiero quitarlo, porque las imágenes al final del campo suelen ser imágenes que no tienen nada que ver con el contenido. En el caso de los feedburner, feedburner los agrega a cada artículo en un feed. Otras veces, son enlaces rotos que rodean imágenes rotas. El punto no son las etiquetas html img válidas que se pueden eliminar fácilmente. Son las etiquetas destrozadas que, si no están codificadas, no serán válidas como html, que no se podrán analizar con los analizadores html estándar.

[EDIT] Si era sólo una cuestión de tirar el html que quería salir y hacer un strip_tags y volver a insertar los datos, no estaría haciendo esta pregunta.

La parte con la que tengo un problema es que lo que solía ser una etiqueta img estaba codificado en html y el final se cortó. Si está codificado, será no una etiqueta html, por lo que I no se puede analizar de la manera habitual.

Con toda la mierda de &lt;img src=&quot;, no puedo entender lo que no es SELECT ID, post_content FROM table WHERE post_content LIKE '&lt;img' que al menos me da esas publicaciones. Pero cuando obtengo la información, necesito encontrarla, eliminarla, pero guardar el resto del contenido.

[/ EDIT]

[EDIT 2]

<img src="http://farm4.static.flickr.com/3162/2735565872_b8a4e4bd17.jpg" alt="post_img" width="80" />Through the first two months of the year, the volume of cargo handled at Port of Portland terminals has increased 46 percent as the port?s marine cargo business shows signs of recovering from a dismal 2009.<div> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/bizj_portland?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/bizj_portland?i=YIs66yw13JE:_zirAnH6dt8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/bizj_portland?i=YIs66yw13JE:_zirAnH6dt8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:qj6IDK7rITs">&lt;img src=&quot;http://feeds.feedburner.com/~ff/bizj_portland?d=qj6IDK7rITs&quot;

La parte quiero seguir:

<img src="http://farm4.static.flickr.com/3162/2735565872_b8a4e4bd17.jpg" alt="post_img" width="80" />Through the first two months of the year, the volume of cargo handled at Port of Portland terminals has increased 46 percent as the port?s marine cargo business shows signs of recovering from a dismal 2009.

Reiterar: No es sobre la eliminación de las etiquetas html img válidas . Eso es fácil. Necesito poder encontrar específicamente el &lt;img src=&quot;http://feeds.feedburner.com/~ff/bizj_portland?d=qj6IDK7rITs&quot; si es parte del patrón de img tag img tag destrozado img tag o ancla img anchor img img destrozado, imagen etc., pero no eliminar &lt;img si es, de hecho, parte del artículo. De las pocas docenas de muestras que he revisado, ha sido bastante consistente que esta etiqueta img destrozada esté al final del campo.

La otra es la única etiqueta de imagen destrozada. Es consistentemente una etiqueta de flickr img mutilada, pero como arriba, no puedo simplemente buscar &lt;img ya que podría ser una parte válida del contenido.

El problema radica en que no puedo simplemente descodificarlo y analizarlo como HTML, porque no será válido html. [/ EDIT 2]

+4

Estas bromeando ¿verdad? http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Ether

+1

Regex no puede analizar html. +1 @Ehter para el enlace –

+0

Usar expresiones regulares para analizar HTML arbitrario suele ser una mala idea, pero no estoy tan seguro de que eso sea lo que estás haciendo. ¿Qué estás buscando como resultado final? Edite su pregunta anterior y muestre con qué desea terminar cada ejemplo que ha incluido. – benrifkah

Respuesta

2

actualizada pregunta ...

Para extraer los datos que desea, podría utilizar este enfoque:

use HTML::Entities qw/decode_entities/; 

my $decoded = decode_entities $raw; 

if ($decoded =~ s{ (<img .+? (?:>.+?</img>|/>)) } {}x) { # grab the image 
    my $img = $1; 
    $decoded =~ s{<.+?>}  {}xg; # strip complete tags 
    $decoded =~ s{< [^>]+? $} {}x; # strip trailing noise 

    print $img.$decoded; 
} 

Usando una expresión regular para analizar HTML es generalmente mal visto, sin embargo, en este caso, se trata más bien de eliminar segmentos que coinciden con un patrón. Después de probar las expresiones regulares en un conjunto de datos más grande, debe tener una idea de lo que podría necesitar ser retocado.

Espero que esto ayude.

+0

No he tenido tiempo de probar, pero por lo que puedo ver, esta es la dirección a la que me gustaría ir. Como la última etiqueta de img está mal formada, creo que esto ayudará a encontrarla. Y capturar podría no ser una mala idea. ¡Gracias! –

0

¿Qué tal un simple Perl estúpida buscar y reemplazar en el var que contiene sus datos ...

foreach $line(@lines) { 
    $line =~ s/&lt;/</gi; 
    $line =~ s/&gt;/>/gi; 
} 
+1

maldita codificación en esta página arruinó mi publicación! ;) Lo intentaré de nuevo, pero prolly no funcionará;) $ línea = ~ s/<//gi; – onethreefour

+0

¿Ves lo que quiero decir? Y no hay líneas. Todo está en una línea. –

3

La mejor manera es:

  1. Instalar HTML::Entities de CPAN y úselo para deshacer el escape de los URI.
  2. Instale HTML::Parser de CPAN y úselo para analizar y eliminar los URI después de que no estén protegidos.

Regexes no son una herramienta adecuada para esta tarea.

+1

No creo que el UPA no resecado sea lo que ella necesita.La separación de URI es para cambiar "% 5D" en "]" y otras cosas. Lo que puede ser útil es la función decode_entities de HTML :: Entities para convertir "<" en "<" y así sucesivamente. – benrifkah

+0

Los datos no se formatearán html correctamente una vez que se decodifiquen. –

+0

¿Está buscando convertir lo que tiene en HTML válido? Si es así, el título de su pregunta es un poco engañoso. Pregunta cómo eliminar HTML. Por favor aclara – benrifkah

2

No me lo quitaría. Está lejos de basura irrecuperable.

En primer lugar se aplica HTML::Entities::decode_entities condicionalmente (use la aparición de < como el primer carácter heurístico), entonces vamos HTML::Tidy::libXML->clean(…, 'UTF-8', 1) reconstruir el margen de la forma prevista. clean devuelve un documento completo, pero es trivial extraer solo el elemento img necesario.

0

Lo mejor que puede hacer es recopilar todos los artículos que están en la base de datos para que no se trunquen ni dañen. Si esto no es una opción, entonces ...

Según los ejemplos anteriores, parece que está eliminando todo lo que sigue al contenido de texto de cada artículo. En su ejemplo, el contenido del texto va seguido de una etiqueta DIV y un grupo de etiquetas IMG que pueden o no haber sido truncadas o convertidas en entidades HTML.

Si todos los registros son similares se puede retirar de él todo lo que después el contenido del texto mediante la eliminación de la etiqueta div final y todo lo que le sigue usando Perl así:

my $article = magic_to_get_an_article(); 
$article =~ s/<div>.*//s; 
magic_to_store_article($article); 

Si sus registros incluyen algo más complejo Además, es mejor utilizar un módulo de análisis HTML y leer la documentación cuidadosamente para saber cómo maneja el código HTML no válido.

0

Dada la entrada de la muestra y la salida que da al final de su mensaje, lo siguiente será conseguir que la salida deseada:

#!/usr/bin/perl 

use strict; use warnings; 

use HTML::TokeParser::Simple; 
my $parser = HTML::TokeParser::Simple->new(\*DATA); 

if (my $tag = $parser->get_tag('img')) { 
    print $tag->as_is; 
    print $parser->get_text('div'); 
} 

__DATA__ 
<img src="http://farm4.static.flickr.com/3162/2735565872_b8a4e4bd17.jpg" alt="post_img" width="80" />Through the first two months of the year, the volume of cargo handled at Port of Portland terminals has increased 46 percent as the port?s marine cargo business shows signs of recovering from a dismal 2009.<div> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/bizj_portland?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/bizj_portland?i=YIs66yw13JE:_zirAnH6dt8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/bizj_portland?i=YIs66yw13JE:_zirAnH6dt8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.bizjournals.com/~ff/bizj_portland?a=YIs66yw13JE:_zirAnH6dt8:qj6IDK7rITs">&lt;img src=&quot;http://feeds.feedburner.com/~ff/bizj_portland?d=qj6IDK7rITs&quot; 

Salida:

<img src="http://farm4.static.flickr.com/3162/2735565872_b8a4e4bd17.jpg" alt="po st_img" width="80" />Through the first two months of the year, the volume of car go handled at Port of Portland terminals has increased 46 percent as the port?s marine cargo business shows signs of recovering from a dismal 2009.

Sin embargo, yo soy desconcertado en cuanto al tamaño y el alcance de cada pedazo que se supone que debes procesar.

Cuestiones relacionadas