Eu gostaria de extrair o texto de um arquivo HTML usando Python. Quero essencialmente a mesma saída que obteria se copiasse o texto de um navegador e o colasse no bloco de notas.
Eu gostaria de algo mais robusto do que usar expressões regulares que podem falhar em HTML mal formado. Eu já vi muitas pessoas recomendando Sopa Bonita, mas tive alguns problemas ao usá-lo. Por um lado, ele captou texto indesejado, como fonte JavaScript. Além disso, ele não interpretou entidades HTML. Por exemplo, eu esperaria que o & # 39; na fonte HTML para ser convertido em um apóstrofo no texto, como se eu tivesse colado o conteúdo do navegador no bloco de notas.
A atualização html2text
parece promissora. Ele lida com entidades HTML corretamente e ignora JavaScript. No entanto, ele não produz exatamente texto sem formatação; produz reduções que teriam que ser transformadas em texto sem formatação. Ele vem sem exemplos ou documentação, mas o código parece limpo.
Perguntas relacionadas:
fonte
Respostas:
html2text é um programa Python que faz um bom trabalho nisso.
fonte
O melhor pedaço de código que encontrei para extrair texto sem obter javascript ou coisas não desejadas:
Você só precisa instalar o BeautifulSoup antes:
fonte
text = soup.get_text(separator=' ')
soup.get_text()
eu usá-soup.body.get_text()
lo, para não receber nenhum texto do<head
elemento>, como o título.from urllib.request import urlopen
NOTA: O NTLK não suporta mais a
clean_html
funçãoResposta original abaixo e uma alternativa nas seções de comentários.
Use NLTK
Eu perdi minhas 4-5 horas corrigindo os problemas com o html2text. Felizmente eu poderia encontrar o NLTK.
Funciona magicamente.
fonte
raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
Me vi enfrentando o mesmo problema hoje. Escrevi um analisador HTML muito simples para remover o conteúdo de todas as marcações, retornando o texto restante com apenas um mínimo de formatação.
fonte
&
não será convertido em&
, certo?from html.parser import HTMLParser
Aqui está uma versão da resposta do xperroni, que é um pouco mais completa. Ignora as seções de script e estilo e converte charrefs (por exemplo, & # 39;) e entidades HTML (por exemplo, & & amp;).
Ele também inclui um conversor inverso trivial de texto sem formatação para html.
fonte
Sei que já existem muitas respostas, mas a solução mais elegante e pitônica que encontrei é descrita, em parte, aqui .
Atualizar
Com base no comentário de Fraser, aqui está uma solução mais elegante:
fonte
text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
Você também pode usar o método html2text na biblioteca de stripogramas.
Para instalar o stripogram, execute sudo easy_install stripogram
fonte
Existe uma biblioteca de padrões para mineração de dados.
http://www.clips.ua.ac.be/pages/pattern-web
Você pode até decidir quais tags manter:
fonte
PyParsing faz um ótimo trabalho. O wiki do PyParsing foi eliminado, então aqui está outro local onde há exemplos de uso do PyParsing ( link de exemplo ). Uma razão para investir um pouco de tempo com o pyparsing é que ele também escreveu um manual muito breve e muito bem organizado da O'Reilly Short Cut, que também é barato.
Dito isto, eu uso muito o BeautifulSoup e não é tão difícil lidar com os problemas das entidades, você pode convertê-los antes de executar o BeautifulSoup.
Boa sorte
fonte
Esta não é exatamente uma solução Python, mas converterá o texto que o Javascript geraria em texto, o que eu acho importante (EG google.com). O navegador Links (não o Lynx) tem um mecanismo Javascript e converterá a fonte em texto com a opção -dump.
Então você pode fazer algo como:
fonte
Em vez do módulo HTMLParser, confira htmllib. Ele tem uma interface semelhante, mas faz mais trabalho para você. (É bastante antigo, por isso não ajuda muito em termos de se livrar de javascript e css. Você pode criar uma classe derivada, mas adicionar métodos com nomes como start_script e end_style (consulte os documentos em python para obter detalhes), mas é difícil para fazer isso de forma confiável em html malformado.) De qualquer forma, aqui está algo simples que imprime o texto sem formatação no console
fonte
Eu recomendo que um pacote Python chamado goose-extractor Goose tente extrair as seguintes informações:
Texto principal de um artigo Imagem principal do artigo Quaisquer filmes do Youtube / Vimeo incorporados no artigo Meta Descrição Meta tags
Mais: https://pypi.python.org/pypi/goose-extractor/
fonte
se você precisar de mais velocidade e menos precisão, poderá usar o lxml bruto.
fonte
instale o html2text usando
então,
fonte
Sei que já há muitas respostas aqui, mas acho que o newspaper3k também merece uma menção. Recentemente, eu precisei concluir uma tarefa semelhante de extrair o texto de artigos na Web e essa biblioteca fez um excelente trabalho para conseguir isso até agora em meus testes. Ele ignora o texto encontrado nos itens de menu e barras laterais, bem como qualquer JavaScript que aparece na página conforme o pedido do OP.
Se você já tiver baixado os arquivos HTML, poderá fazer algo assim:
Ele ainda possui alguns recursos de PNL para resumir os tópicos dos artigos:
fonte
Sopa bonita converte entidades html. Provavelmente, é a sua melhor aposta, considerando que o HTML geralmente é buggy e está cheio de problemas de codificação unicode e html. Este é o código que eu uso para converter html em texto bruto:
fonte
Outra opção é executar o html através de um navegador da Web baseado em texto e despejá-lo. Por exemplo (usando o Lynx):
Isso pode ser feito dentro de um script python da seguinte maneira:
Não fornecerá exatamente o texto do arquivo HTML, mas dependendo do seu caso de uso, pode ser preferível à saída do html2text.
fonte
O melhor que funcionou para mim é a inscrição.
https://github.com/weblyzard/inscriptis
Os resultados são realmente bons
fonte
Outra solução não-python: Libre Office:
A razão pela qual prefiro esta sobre outras alternativas é que todo parágrafo HTML é convertido em uma única linha de texto (sem quebras de linha), que é o que eu estava procurando. Outros métodos requerem pós-processamento. O Lynx produz resultados agradáveis, mas não exatamente o que eu estava procurando. Além disso, o Libre Office pode ser usado para converter de todos os tipos de formatos ...
fonte
Alguém já tentou
bleach.clean(html,tags=[],strip=True)
com água sanitária ? está funcionando para mim.fonte
Eu tive bons resultados com o Apache Tika . Seu objetivo é a extração de metadados e texto do conteúdo; portanto, o analisador subjacente é ajustado de maneira apropriada.
O Tika pode ser executado como um servidor , é trivial para executar / implantar em um contêiner do Docker e a partir daí pode ser acessado por meio de ligações do Python .
fonte
de uma maneira simples
esse código localiza todas as partes do html_text iniciadas com '<' e terminando com '>' e substituem todas as encontradas por uma sequência vazia
fonte
A resposta da @ PeYoTIL usando BeautifulSoup e eliminando o estilo e o conteúdo do script não funcionou para mim. Eu tentei usando em
decompose
vez de,extract
mas ainda não funcionou. Então eu criei o meu próprio, que também formata o texto usando as<p>
tags e as substitui<a>
pelo link href. Também lida com links dentro do texto. Disponível nesta essência com um documento de teste incorporado.fonte
get_text
simplesmente não resolve.No Python 3.x, você pode fazer isso de uma maneira muito fácil, importando os pacotes 'imaplib' e 'email'. Embora este seja um post antigo, talvez minha resposta possa ajudar os novatos nesse post.
Agora você pode imprimir a variável do corpo e ela estará no formato de texto sem formatação :) Se for bom o suficiente para você, seria bom selecioná-la como resposta aceita.
fonte
text/plain
parte de um email se outra pessoa colocar uma lá. Ele não faz nada para converter o HTML em texto sem formatação e não faz nada remotamente útil se você estiver tentando converter HTML de, digamos, um site.você pode extrair apenas texto do HTML com BeautifulSoup
fonte
Embora muitas pessoas mencionem o uso do regex para remover as tags html, há muitas desvantagens.
por exemplo:
Deve ser analisado para:
Aqui está um trecho que eu criei, você pode personalizá-lo para suas necessidades específicas e funciona como um encanto
fonte
Outro exemplo usando BeautifulSoup4 em Python 2.7.9+
inclui:
Código:
Explicado:
Leia os dados da url como html (usando BeautifulSoup), remova todos os elementos de script e estilo e obtenha apenas o texto usando .get_text (). Divida em linhas e remova o espaço inicial e final de cada uma e, em seguida, divida as várias manchetes em uma linha de cada pedaço = (frase.strip () para linha em linhas para frase em line.split ("")). Em seguida, usando text = '\ n'.join, solte as linhas em branco e, finalmente, retorne como utf-8 sancionado.
Notas:
Alguns sistemas em que é executado falham com conexões https: // devido a um problema de SSL. Você pode desativar a verificação para corrigir esse problema. Correção de exemplo: http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/
Python <2.7.9 pode ter algum problema ao executar este
text.encode ('utf-8') pode deixar uma codificação estranha, mas pode retornar apenas str (text).
fonte
Aqui está o código que eu uso regularmente.
Espero que ajude.
fonte
O comentário do gravador do LibreOffice tem mérito, pois o aplicativo pode empregar macros python. Parece oferecer vários benefícios, tanto para responder a essa pergunta quanto para promover a base macro do LibreOffice. Se esta resolução for uma implementação pontual, em vez de ser usada como parte de um programa de produção maior, abrir o HTML no gravador e salvar a página como texto pareceria resolver os problemas discutidos aqui.
fonte
Perl way (desculpe mãe, eu nunca vou fazer isso em produção).
fonte