Domanda

Voglio estrarre del testo in un determinato sito Web. ecco l'indirizzo web quello che voglio estrarre del testo per fare raschietto. http://news.search.naver.com/search.naver?sm=tab_hty & amp; where = news & amp; query = times & amp; x = 0 < !> amp; y = 0 in questa pagina, voglio estrarre un po 'di testo con oggetto e campo del contenuto separatamente. ad esempio, se apri quella pagina, puoi vedere del testo nella pagina,

FESTIVAL INTERNAZIONALE DEL CINEMA DEL GIAPPONE TOKYO     EPA # 50672 &; # 54633 &; # 45684 &; & # 49828; # 49464 &; & # 44228; | 2009.10.25 (& # 51068;) & # 50724; & # 54980; 07:21     Giappone, 25 ottobre 2009. Gayet ha vinto il premio per la migliore attrice per il ruolo nel film "Eight Times Up" diretto dal cineasta francese Xabi Molia. EPA / DAI KUROKAWA

FESTIVAL INTERNAZIONALE DEL CINEMA DEL GIAPPONE TOKYO     EPA # 50672 &; # 54633 &; # 45684 &; & # 49828; # 49464 &; & # 44228; | 2009.10.25 (& # 51068;) & # 50724; & # 54980; 07:18     scopre di aver vinto il premio come migliore attrice per il suo ruolo nel film "Eight Times Up" del regista francese Xabi Molia durante la cerimonia di premiazione della 22a Tokyo ...

e così via ,,,,

e infine voglio estrarre testo come il formato

SOGGETTO: JAPAN TOKYO INTERNATIONAL FILM FESTIVAL CONTENUTI: &; &; &; & EPA # 50672 # 54633 # 45684 # 49828; # 49464 &; & # 44228; | 2009.10.25 (& # 51068;) & # 50724; & # 54980; 7:21 Giappone, 25 ottobre 2009. Gayet ha vinto il premio come migliore attrice per il suo ruolo nel film "Eight Times Up" diretto dal cineasta francese Xabi Molia. EPA / DAI KUROKAWA

SOGGETTO: ... CONTENUTO: ...

E così via .. se qualcuno aiuta, apprezzo molto. grazie in anticipo.

È stato utile?

Soluzione

In generale, per risolvere tali problemi devi prima scaricare la pagina di interesse come testo (usa urllib.urlopen o qualsiasi altra cosa, anche utility esterne come curl o wget, ma non un browser poiché vuoi vedere come la pagina sembra prima qualsiasi Javascript abbia avuto la possibilità di funzionare) e studiarlo per comprenderne la struttura. In questo caso, dopo alcuni studi, scoprirai che le parti rilevanti sono (tagliare alcune parti irrilevanti in head e spezzare le linee per leggibilità) ...:

<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 così via. Quindi, vuoi come & Quot; subject & Quot; il contenuto di un tag <a> all'interno di un <dt> e come " contenuto " il contenuto di <dd> tag che lo seguono (nello stesso <dl>).

Le intestazioni che ottieni contengono:

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

quindi devi anche trovare un modo per interpretare quella codifica in Unicode - credo che la codifica sia anche conosciuta come 'euc_kr' e la mia installazione di Python sembra avere un codec, ma dovresti anche controllare la tua.

Dopo aver determinato tutti questi aspetti, si tenta di lxml.etree.parse l'URL e, proprio come tante altre pagine Web, non analizza - non presenta realmente HTML ben formato ( prova i validatori di w3c su di esso per scoprire alcuni dei modi in cui si è rotto).

Poiché l'HTML mal formato è così comune sul web, esistono " parser tolleranti " che tenta di compensare errori comuni. Il più popolare in Python è BeautifulSoup, e in effetti lxml viene fornito con esso - con lxml 2.0.3 o successivo, puoi usare BeautifulSoup come parser sottostante, quindi procedere & Quot; proprio come se & Quot; il documento è stato analizzato correttamente, ma trovo più semplice utilizzare BeautifulSoup direttamente.

Ad esempio, ecco uno script per emettere le prime coppie oggetto / contenuto in quell'URL (sono state cambiate attualmente, originariamente erano le stesse che hai dato ;-). È necessario un terminale che supporti l'output Unicode (ad esempio, lo eseguo senza problemi su un Terminal.App di Mac impostato su utf-8) - ovviamente, invece dei print s, è possibile raccogliere i frammenti Unicode (ad es. aggiungili a un elenco e ''.join quando hai tutti i pezzi richiesti), codificali come preferisci, ecc. ecc.

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)

La logica in lxml o " BeautifulSoup in abbigliamento lxml " ;, non è molto diversa, solo l'ortografia e la capitalizzazione delle varie operazioni di navigazione cambiano un po '.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top