Pergunta

Eu salvei html de uma página inteira para uma cadeia, e agora Eu quero pegar os valores "href" a partir dos links, de preferência com a capacidade de salvá-los em diferentes cordas mais tarde. Qual é a melhor maneira de fazer isso?

Eu tentei salvar a string como um doc .xml e analisá-lo usando um navegador XPathDocument, mas (surpresa, surpresa) não navegar em um não-realmente-an-xml-documento muito bem.

são expressões regulares do melhor maneira de conseguir o que eu estou tentando fazer?

Foi útil?

Solução

As expressões regulares são uma maneira de fazê-lo, mas pode ser problemático.

Páginas mais HTML não pode ser analisado utilizando técnicas de HTML padrão, porque, como você descobriu, a maioria não validar.

Você poderia passar o tempo tentando integrar HTML Tidy ou uma ferramenta semelhante, mas seria muito mais mais rápido para apenas construir a regex que você precisa.

Atualizar

No momento desta actualização Recebi 15 para cima e 9 downvotes. Eu acho que talvez as pessoas não estão lendo a pergunta nem os comentários sobre esta resposta. Todo o OP queria fazer era pegar os valores href. É isso. A partir dessa perspectiva, uma regex simples é apenas multa. Se o autor quis analisar outros itens, então não há nenhuma maneira eu recomendaria regex como eu disse no início, é problemático na melhor das hipóteses.

Outras dicas

Posso recomendar o href="http://www.codeplex.com/htmlagilitypack" rel="noreferrer"> HTML agilidade pack . Eu usei-o em poucos casos em que eu precisava para analisar HTML e ele funciona muito bem. Uma vez que você carregar o seu HTML para ele, você pode usar XPath expressões para consulta o documento e obter suas marcas de âncora (assim como qualquer outra coisa lá dentro).

HtmlDocument yourDoc = // load your HTML;
int someCount = yourDoc.DocumentNode.SelectNodes("your_xpath").Count;

Para lidar com HTML de todas as formas e tamanhos, eu prefiro usar o pacote HTMLAgility @ http: //www.codeplex .com / HtmlAgilityPack ele permite que você escrever XPaths contra os nós que deseja e obter aqueles retorno em uma coleção.

Provavelmente você quer algo como o analisador Majestic: http: //www.majestic12. co.uk/projects/html_parser.php

Existem algumas outras opções que podem lidar com esquisito html, bem. A agilidade Pacote Html vale uma olhada, como alguém referiu.

Eu não acho que expressões regulares são uma solução ideal para HTML, uma vez que HTML não é livre de contexto. Eles provavelmente vão produzir um adequado, se imprecisa, resultar; mesmo deterministically identificação de um URI é um problema confuso.

É sempre melhor, se possível não redescobrir a roda. existem algumas ferramentas boas que quer converter HTML para XML bem formado, ou agir como um XmlReader:

Aqui estão três ferramentas boas:

  1. TagSoup , um programa de código aberto, é um Java e SAX - ferramenta baseada, desenvolvido pela John Cowan . Isto é um parser SAX-compliant escrito em Java que, em vez de analisar bem formado ou XML válido, parses HTML, uma vez que é encontrado na natureza: pobre, desagradável e brutal, embora muitas vezes longe de ser curto. TagSoup é projetado para pessoas que têm de processar este material usando alguma aparência de um desenho racional aplicação. Ao fornecer uma interface SAX, ele permite que ferramentas XML padrão a ser aplicado ao mesmo o pior HTML. TagSoup também inclui um processador de linha de comando que lê arquivos HTML e pode gerar tanto HTML limpa ou XML bem formado que é uma aproximação para XHTML.
    Taggle é uma porta comercial C ++ da TagSoup.

  2. SgmlReader é uma ferramenta desenvolvida pela Microsoft de Chris Lovett .
    SgmlReader é uma API XmlReader sobre qualquer documento SGML (incluindo suporte embutido para HTML). Um utilitário de linha de comando também é fornecido que emite o resultado XML bem formado.
    Baixe o arquivo zip incluindo o executável autônomo eo código fonte completo: "http://code.msdn.microsoft.com/SgmlReader/Release/ProjectReleases.aspx" SgmlReader.zip

  3. Uma conquista notável é o XSLT pura 2.0 Analisador de HTML escrito por David Carlisle .

Leitura seu código seria um grande exercício de aprendizagem para todos nós.

A partir da descrição:

" d: htmlparse (string)
d: htmlparse (string, namespace, html-mode)
A forma um argumento é equivalente a)
d: htmlparse (string, ' http://ww.w3.org/1999/xhtml ', true ()))
Analisa a cadeia como HTML e / ou XML usando algumas heurísticas inerente a)
controlar a abertura e fecho implícita de elementos.
Ele não tem pleno conhecimento de HTML DTD, mas não têm lista completa de
elementos vazios e lista completa de definições de entidades. entidades HTML e
referências decimais e caracteres hex são todos aceitos. Nota html entidades
são reconhecidos mesmo que html-mode = false ().
Os nomes dos elementos são em minúsculas (se html-mode é verdade ()) e colocado no
namespace especificado pelo parâmetro de namespace (que pode ser "" para denotar
no-namespace a menos que a entrada tem declarações de namespace explict, em
que caso estes serão honrados.
nomes de atributos são em minúsculas se html-mode = true ()
"

Leia uma descrição mais detalhada aqui .

Espero que isso ajudou.

Cheers,

Dimitre Novatchev.

Eu concordo com Chris Lively, porque HTML muitas vezes não é muito bem formado, você provavelmente é melhor fora com uma expressão regular para isso.

href=[\"\'](http:\/\/|\.\/|\/)?\w+(\.\w+)*(\/\w+(\.\w+)?)*(\/|\?\w*=\w*(&\w*=\w*)*)?[\"\']

A partir aqui em RegExLib deve começar

Você pode ter mais sorte usando xml se você sabe ou pode corrigir o documento para ser pelo menos bem formado. Se você tiver boa html (ou melhor, xhtml), o sistema xml na Net deve ser capaz de lidar com isso. Infelizmente, boa html é extremamente rara.

Por outro lado, as expressões regulares são realmente ruim na análise de HTML. Felizmente, você não precisa lidar com uma especificação HTML completo. Tudo que você precisa se preocupar é analisar cadeias href= para obter a URL. Mesmo isso pode ser complicado, por isso não vou fazer uma tentativa de la imediatamente. Em vez Vou começar por fazer algumas perguntas para tentar estabelecer algumas regras básicas. Eles basicamente se resumem a "Quanto você sabe sobre o documento?", Mas aqui vai:

  • Você sabe se o texto "href" será sempre minúsculas?
  • Você sabe se ele vai sempre usar aspas, aspas simples ou nada ao redor do url?
  • É sempre uma URL válida, ou você precisa de conta para coisas como '#', instruções JavaScript, e assim por diante?
  • É possível trabalhar com um documento onde o conteúdo descreve html apresenta? (IE: href= também poderia ser no documento e não pertence a uma marca de âncora)
  • O que mais você pode nos dizer sobre o documento?

Tenho ligado algum código aqui que vai deixar você usar "LINQ to HTML" ...

Procurando por C # HTML parser

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top