Pergunta

Eu quero extrair algum texto em determinado site. aqui é o endereço web que eu quero extrair algum texto para fazer raspador. http: //news.search.naver. com / search.naver? sm = tab_hty & where = notícias & query = vezes & x = 0 e y = 0 nesta página, eu quero extrair algum texto com o assunto e campo de conteúdo separadamente. por exemplo, se você abrir essa página, você pode ver algum texto na página,

Japão Tóquio FESTIVAL INTERNACIONAL DE CINEMA EPA ?? ?? ?? | 2009.10.25 (?) ?? 07:21 Japão, 25 de outubro de 2009. Gayet ganhou o Prêmio de Melhor Atriz por seu papel no filme 'Oito vezes Up' dirigido pelo francês cineasta Xabi Molia. EPA / DAI KUROKAWA

Japão Tóquio FESTIVAL INTERNACIONAL DE CINEMA EPA ?? ?? ?? | 2009.10.25 (?) ?? 07:18 ela descobre que ela ganhou o prêmio de Melhor Atriz por seu papel no filme 'Oito vezes Up' pelo diretor de cinema francês Xabi Molia durante a cerimônia de premiação do 22º Tokyo ...

e assim por diante ,,,,

e, finalmente, eu quero extrair o texto tal como o formato

Assunto: Japão Tóquio FESTIVAL INTERNACIONAL DE CINEMA CONTEÚDO: EPA ?? ?? ?? | 2009.10.25 (?) ?? 07:21 Japão, 25 de outubro de 2009. Gayet ganhou o Prêmio de Melhor Atriz por seu papel no filme 'Oito vezes Up' dirigido pelo francês cineasta Xabi Molia. EPA / DAI KUROKAWA

Assunto: ... CONTEÚDO: ...

E assim por diante .. se alguém ajuda, realmente aprecio. obrigado antecipadamente.

Foi útil?

Solução

Em geral, para resolver tais problemas primeiro você deve baixar a página de interesse como texto (use urllib.urlopen ou qualquer outra coisa, até mesmo utilitários externos, tais como curl ou wget, mas não é um navegador desde que você queira ver a aparência da página < em> antes qualquer Javascript teve a chance de correr) e estudá-lo a compreender a sua estrutura. Neste caso, depois de algum estudo, você vai encontrar as partes relevantes são (cortando algumas partes irrelevantes em head e quebrar linhas para facilitar a leitura) ...:

<body onload=nx_init();>
 <dl>
 <dt>
<a href="http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=&oid=091&aid=0002497340"
 [[snipping other attributes of this tag]]>
JAPAN TOKYO INTERNATIONAL FILM FESTIVAL</a>
</dt>
 <dd class="txt_inline">
EPA¿¬ÇÕ´º½º ¼¼°è <span class="bar">
|</span>
 2009.10.25 (ÀÏ) ¿ÀÈÄ 7:21</dd>
 <dd class="sh_news_passage">
 Japan, 25 October 2009. Gayet won the Best Actress Award for her role in the film 'Eight <b>
Times</b>
 Up' directed by French filmmaker Xabi Molia. EPA/DAI KUROKAWA</dd>

e assim por diante. Então, você quer como "assunto" o conteúdo de uma tag <a> dentro de um <dt>, e como "conteúdo" o conteúdo das marcas <dd> que se lhe segue (na mesma <dl>).

Os cabeçalhos que você começa conter:

Content-Type: text/html; charset=ks_c_5601-1987

então você também deve encontrar uma maneira de interpretar esse tipo de codificação para Unicode -. Acredito que a codificação é também conhecido como 'euc_kr' e minha instalação do Python parece vir com um codec para isso, mas você deve verificar o seu também

Depois de determinar todos estes aspectos, você tenta lxml.etree.parse o URL - e, assim como tantas outras páginas da web, ele não analisa - não realmente presente HTML bem formado (tentativa W3C de validadores sobre ela para saber mais sobre algumas das maneiras que não está funcionando).

Por causa mal-formado HTML é tão comum na web, existem "analisadores tolerantes" que tentam compensar erros comuns. O mais popular em Python é BeautifulSoup, e de fato lxml vem com ele - com lxml 2.0.3 ou posterior, você pode usar BeautifulSoup como o analisador subjacente, em seguida, proceder "como se" o documento havia analisado corretamente - mas eu acho -lo mais simples de usar BeautifulSoup diretamente.

Por exemplo, aqui está um script para emitir as primeiras sujeitos / pares de conteúdo em que URL (eles mudaram atualmente, originalmente eles estavam sendo o mesmo que você dá ;-). Você precisa de um terminal que suporta Unicode saída (por exemplo, eu corro isso sem problema em Terminal.App conjunto de um Mac para utf-8) - naturalmente, em vez dos prints possível de outra forma coletar os fragmentos Unicode (por exemplo, anexá-las para uma lista e ''.join-los quando você tem todas as peças necessárias), codificá-los como quiser, etc, etc.

from BeautifulSoup import BeautifulSoup
import urllib

def getit(pagetext, howmany=0):
  soup = BeautifulSoup(pagetext)
  results = []
  dls = soup.findAll('dl')
  for adl in dls:
    thedt = adl.dt
    while thedt:
      thea = thedt.a
      if thea:
        print 'SUBJECT:', thea.string
      thedd = thedt.findNextSibling('dd')
      if thedd:
        print 'CONTENT:',
        while thedd:
          for x in thedd.findAll(text=True):
            print x,
          thedd = thedd.findNextSibling('dd')
        print
      howmany -= 1
      if not howmany: return
      print
      thedt = thedt.findNextSibling('dt')

theurl = ('http://news.search.naver.com/search.naver?'
          'sm=tab%5Fhty&where=news&query=times&x=0&y=0')
thepage = urllib.urlopen(theurl).read()
getit(thepage, 3)

A lógica em lxml, ou "BeautifulSoup com roupas lxml", não é muito diferente, apenas a ortografia e capitalização das várias operações de navegação muda um pouco.

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