Pergunta

Eu tenho uma lista de sites para cada membro do Congresso dos EUA que estou programaticamente rastejando para raspar endereços. Muitos dos sites variam em sua marcação subjacente, mas isso não foi inicialmente um problema até que eu comecei a ver que centenas de sites não estavam dando os resultados esperados para o roteiro que eu havia escrito.

Depois de dedicar mais tempo para avaliar possíveis causas, descobri que chamado strip_tags() nos resultados de file_get_contents() estava apagando a maior parte da fonte da página muitas vezes! Isso não estava apenas removendo o HTML, estava removendo o não-HTML que eu queria raspar!

Então eu removi a chamada para strip_tags(), substituiu uma chamada para remover todos os caracteres não alfanuméricos e deu ao processo outra execução. Aumentou outros resultados, mas ainda não tinha muitos. Desta vez, foi porque minhas expressões regulares não estavam correspondendo aos padrões desejados. Depois de olhar para o código retornado, percebi que tinha os remanescentes dos atributos HTML intercalados ao longo do texto, quebrando meus padrões.

Existe uma maneira de contornar isso? É o resultado do HTML malformado? Posso fazer alguma coisa sobre isso?

Foi útil?

Solução

Há um aviso no manual do PHP que diz:

Porque Strip_tags () não valida na verdade o HTML, as tags parciais ou quebradas podem resultar na remoção de mais texto/dados do que o esperado.

Como você está raspando muitos sites diferentes e não pode explicar a validade do HTML deles, isso sempre será um problema. Infelizmente, os regexps também não farão isso por você, como Os regexps simplesmente não são cortados para serem analisadores de documentos.

Eu usaria algo como PHP Simple HTML Dom Parser, ou mesmo o embutido Domdocument-> loadHtml () método.

Você pode manter um pequeno banco de dados que registrava cada página que desejava raspar e onde as informações foram encontradas na estrutura dessa página. Cada vez que você o raspava, você pode fazer uma verificação rápida para ver se a estrutura havia alterado; nesse caso, você pode atualizar seu banco de dados com o novo local do caminho para o seu analisador DOM e obtê -lo no próximo raspamento.

Outras dicas

O HTML malformado pode muito bem ser a causa.
Você pode tentar carregar as páginas via DomDocument :: loadHtmlfile (). Que seja capaz de "corrigir" os erros.
Também dê uma olhada em libxml_use_internal_errors () pois pode ajudá -lo a identificar e lidar com os problemas.

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