¿Puede proporcionar ejemplos de análisis de HTML?
¿Cómo se analiza HTML con una variedad de idiomas y bibliotecas de análisis?
Al responder:
Se vincularán comentarios individuales en respuestas a preguntas sobre cómo analizar HTML con expresiones regulares como una forma de mostrar la forma correcta de hacer las cosas.
En aras de la coherencia, solicito que el ejemplo analice un archivo HTML para las href
etiquetas de anclaje. Para facilitar la búsqueda de esta pregunta, le pido que siga este formato.
Idioma: [nombre del idioma]
Biblioteca: [nombre de la biblioteca]
[example code]
Haga de la biblioteca un enlace a la documentación de la biblioteca. Si desea proporcionar un ejemplo además de extraer enlaces, incluya también:
Propósito: [lo que hace el análisis]
Idioma: JavaScript
Biblioteca: jQuery
$.each($('a[href]'), function(){
console.debug(this.href);
});
(usando firebug console.debug para la salida...)
Y cargando cualquier página html:
$.get('http://stackoverflow.com/', function(page){
$(page).find('a[href]').each(function(){
console.debug(this.href);
});
});
Usé otra función para esta, creo que es más limpio al encadenar métodos.
Idioma: C#
Biblioteca: HtmlAgilityPack
class Program
{
static void Main(string[] args)
{
var web = new HtmlWeb();
var doc = web.Load("http://www.stackoverflow.com");
var nodes = doc.DocumentNode.SelectNodes("//a[@href]");
foreach (var node in nodes)
{
Console.WriteLine(node.InnerHtml);
}
}
}
Idioma: Biblioteca Python
: BeautifulSoup
from BeautifulSoup import BeautifulSoup
html = "<html><body>"
for link in ("foo", "bar", "baz"):
html += '<a href="http://%s.com">%s</a>' % (link, link)
html += "</body></html>"
soup = BeautifulSoup(html)
links = soup.findAll('a', href=True) # find <a> with a defined href attribute
print links
producción:
[<a href="http://foo.com">foo</a>,
<a href="http://bar.com">bar</a>,
<a href="http://baz.com">baz</a>]
también es posible:
for link in links:
print link['href']
producción:
http://foo.com
http://bar.com
http://baz.com
Idioma: Perl
Biblioteca: pQuery
use strict;
use warnings;
use pQuery;
my $html = join '',
"<html><body>",
(map { qq(<a href="http://$_.com">$_</a>) } qw/foo bar baz/),
"</body></html>";
pQuery( $html )->find( 'a' )->each(
sub {
my $at = $_->getAttribute( 'href' );
print "$at\n" if defined $at;
}
);
lenguaje: biblioteca shell : lynx (bueno, no es una biblioteca, pero en shell, cada programa es una especie de biblioteca)
lynx -dump -listonly http://news.google.com/