como extrair algum texto pelo uso lxml?
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.
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 print
s 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.