Pergunta

Estou tentando buscar HTML em vários blogs e percebi que diferentes provedores usam a mesma tag de maneiras diferentes.

Por exemplo, aqui estão dois provedores principais que usam a tag geradora de metanome de maneira diferente:

  • Blogueiro: <meta content='blogger' name='generator'/> (conteúdo primeiro, nome depois e, sim, aspas simples!)
  • WordPress: <meta name="generator" content="WordPress.com" /> (nome primeiro, conteúdo depois)

Existe uma maneira de extrair o valor do conteúdo para todos os casos (aspas simples/duplas, primeiro/último na linha)?

P.S.Embora eu esteja usando Java, a resposta provavelmente ajudaria mais pessoas se fosse para expressões regulares em geral.

Foi útil?

Solução

A resposta é: não use expressões regulares.

Seriamente.Use um analisador SGML ou um analisador XML se você souber que é um XML válido (provavelmente quase nunca é verdade).Você vai estragar tudo e perder muito tempo tentando acertar.Basta usar o que já está disponível.

Outras dicas

Na verdade, você provavelmente deveria usar algum tipo de analisador HTML onde pudesse inspecionar cada nó (e, portanto, os atributos do nó) no DOM da página.Faz algum tempo que não uso nenhum desses, então não sei os prós e os contras, mas aqui está uma lista http://java-source.net/open-source/html-parsers

Essas diferenças não são realmente importantes de acordo com o padrão XHTML.

Em outras palavras, eles são exatamente a mesma coisa.

Além disso, se você substituir aspas duplas por aspas simples, seria o mesmo.

A maneira típica de 'normalizar' um documento xml é compará-lo usando alguma API que trata o documento como sua representação Infoset.As APIs de estilo DOM e SAX funcionam dessa maneira.

Se você quiser analisá-los manualmente (ou com um RegEx), você terá que replicar todas essas coisas no seu código e, na minha opinião, isso não é prático.

Observação:aspas simples (mesmo sem aspas, se o valor não contiver espaço) é válida de acordo com a especificação HTML do W3C.Citar:

Por padrão, SGML exige que todos os valores de atributos sejam delimitados usando aspas duplas (ASCII decimal 34) ou aspas simples (ASCII decimal 39)...Em certos casos, os autores podem especificar o valor de um atributo sem aspas.

Além disso, não esqueça que a ordem dos atributos pode ser invertida e que outros atributos podem aparecer na tag.

Você pode querer dar ao Java HTMLEditorKit um tiro.É fácil experimentar para ver se a análise fornece o que você está procurando.

Ok, já que você está procurando por linguagem independente, você pode tentar um REGEX como /<meta\s.*content=.*>/ e pegue o resultado disso e analise os valores específicos que você está procurando.Não sou de forma alguma um especialista em REGEX, então provavelmente existe uma maneira melhor, a não ser usar a ferramenta em http://www.codehouse.com/webmaster_tools/regex/ Combinei as duas strings que você forneceu.

Se você precisar usar regex, aqui está uma regex para obter apenas a parte do conteúdo:

content\s*=\s*['"].*?['"]

retorna

content = "blogger"

e

content='Worpress.com'

respectivamente.Não sou especialista em regex, mas isso acontece quando dados seus exemplos em expressão regular.

Depois de conseguir isso, você pode obter tudo entre aspas da maneira que quiser, seja outro regex (que é simplesmente imoral nesse ponto) ou apenas fazer um loop sobre os caracteres.

Se você estiver usando java, você pode querer dar uma olhada sopa de tags, que é um analisador compatível com SAX para "[analisar] HTML conforme encontrado na natureza".

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