Maison  >  Article  >  développement back-end  >  Comment Python explore-t-il les articles de prose.com ?

Comment Python explore-t-il les articles de prose.com ?

零下一度
零下一度original
2017-07-03 09:39:311562parcourir

image.png

Configurer python 2.7

    bs4

    requests

Installer à l'aide de pip pour installer sudo pip install bs4

demandes d'installation sudo pip

Expliquez brièvement l'utilisation de bs4 Parce qu'il explore des pages Web, je vais présenter find et find_all

La différence entre find et find_all est. que les éléments renvoyés sont différents. find renvoie la première balise correspondante et le contenu de la balise

find_all renvoie une liste

Par exemple, nous écrivons un test.html pour tester la différence entre find et find_all. Le contenu est :

<html>
<head>
</head>
<body>
<div id="one"><a></a></div>
<div id="two"><a href="#">abc</a></div>
<div id="three"><a href="#">three a</a><a href="#">three a</a><a href="#">three a</a></div>
<div id="four"><a href="#">four<p>four p</p><p>four p</p><p>four p</p> a</a></div>
</body>
</html>

 <br/>

Ensuite, le code de test.py est :

from bs4 import BeautifulSoup
import lxml

if __name__==&#39;__main__&#39;:
  s = BeautifulSoup(open(&#39;test.html&#39;),&#39;lxml&#39;)
  print s.prettify()
  print "------------------------------"
  print s.find(&#39;div&#39;)
  print s.find_all(&#39;div&#39;)
  print "------------------------------"
  print s.find(&#39;div&#39;,id=&#39;one&#39;)
  print s.find_all(&#39;div&#39;,id=&#39;one&#39;)
  print "------------------------------"
  print s.find(&#39;div&#39;,id="two")
  print s.find_all(&#39;div&#39;,id="two")
  print "------------------------------"
  print s.find(&#39;div&#39;,id="three")
  print s.find_all(&#39;div&#39;,id="three")
  print "------------------------------"
  print s.find(&#39;div&#39;,id="four")
  print s.find_all(&#39;div&#39;,id="four")
  print "------------------------------"

 <br/>

Après l'exécution, nous pouvons voir le résultat. Lors de l'obtention de la balise spécifiée, il n'y a pas beaucoup de différence entre les deux. Lors de l'obtention d'un groupe de balises, la différence entre les deux sera affichée. .


image.png

Il faut donc faire attention à ce que l'on veut en l'utilisant, sinon une erreur apparaîtra
L'étape suivante consiste à obtenir les informations de la page Web via des demandes, je ne comprends pas très bien pourquoi d'autres écrivent sur ce que j'ai entendu et d'autres choses
J'ai directement accédé à la page Web, j'ai obtenu les pages Web de deuxième niveau de plusieurs catégories sur la prose. com via la méthode get, puis j'ai réussi un test de groupe pour explorer toutes les pages Web

def get_html():
  url = ""
  two_html = ['sanwen','shige','zawen','suibi','rizhi','novel']  for doc in two_html:
      i=1          if doc=='sanwen':print "running sanwen -----------------------------"  if doc=='shige':print "running shige ------------------------------"  if doc=='zawen':print 'running zawen -------------------------------'  if doc=='suibi':print 'running suibi -------------------------------'  if doc=='rizhi':print 'running ruzhi -------------------------------'  if doc=='nove':print 'running xiaoxiaoshuo -------------------------'  while(i<10):
        par = {'p':i}
        res = requests.get(url+doc+'/',params=par)if res.status_code==200:
          soup(res.text)
              i+=i

 <br/>

Dans cette partie du code, je n'ai pas traitez le res.status_code qui n'est pas 200. Le problème qui en résulte est que l'erreur ne sera pas affichée et que le contenu analysé sera perdu. Ensuite, j'ai analysé la page Web de Sanwen.net et j'ai découvert qu'il s'agissait de www.sanwen.net/rizhi/&p=1
La valeur maximale de p est 10. Je ne comprends pas la dernière fois que j'ai exploré le disque, c'était 100 pages, je l'analyserai plus tard. Récupérez ensuite le contenu de chaque page via la méthode get.
Après avoir obtenu le contenu de chaque page, il s'agit d'analyser l'auteur et le titre. Le code est comme ça

def soup(html_text):
  s = BeautifulSoup(html_text,'lxml')
  link = s.find('div',class_='categorylist').find_all('li')  for i in link:if i!=s.find('li',class_='page'):
      title = i.find_all('a')[1]
      author = i.find_all('a')[2].text
      url = title.attrs['href']
      sign = re.compile(r'(//)|/')
      match = sign.search(title.text)
      file_name = title.text      if match:
        file_name = sign.sub('a',str(title.text))

 <br/>

Là. C'est une triche lors de l'obtention du titre, je voudrais vous demander pourquoi vous ajoutez des barres obliques dans le titre de votre prose, non seulement une mais aussi deux. Ce problème a directement provoqué une erreur dans le nom du fichier lorsque j'ai écrit le fichier. plus tard, j'ai donc écrit une expression régulière et je vous la donnerai. Changez de carrière.
La dernière étape consiste à obtenir le contenu en prose. Grâce à l'analyse de chaque page, obtenir l'adresse de l'article, puis obtenir directement le contenu, à l'origine, je voulais l'obtenir un par un directement en changeant l'adresse de la page web, ce qui évite des ennuis.

def get_content(url):
  res = requests.get(''+url)  if res.status_code==200:
    soup = BeautifulSoup(res.text,'lxml')
    contents = soup.find('div',class_='content').find_all('p')
    content = ''for i in contents:
      content+=i.text+'\n'return content

 <br/>

Enfin, écrivez le fichier et enregistrez-le ok

   f = open(file_name+'.txt','w')      print 'running w txt'+file_name+'.txt'  f.write(title.text+'\n')
      f.write(author+'\n')
      content=get_content(url)     
      f.write(content)
      f.close()

Trois fonctions sont utilisées pour obtenir de la prose sur Prose.com, mais il y a un problème est que je ne sais pas pourquoi de la prose est perdue. Je ne peux obtenir qu'environ 400 articles. les articles de Prose.com, mais c'est le cas. Je l'ai eu page par page. J'espère que quelqu'un pourra m'aider avec cette question. Peut-être devrions-nous rendre la page Web inaccessible. Bien sûr, je pense que cela a quelque chose à voir avec le réseau cassé dans mon dortoir

     f = open(file_name+'.txt','w')      print 'running w txt'+file_name+'.txt'  f.write(title.text+'\n')
      f.write(author+'\n')
      content=get_content(url)     
      f.write(content)
      f.close()

J'ai presque oublié. à propos du rendu

Bien que le code soit brouillon, je ne m'arrête jamais


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn