Maison  >  Article  >  développement back-end  >  Tutoriel d'exemple d'article d'exploration Python

Tutoriel d'exemple d'article d'exploration Python

巴扎黑
巴扎黑original
2017-08-07 17:37:451840parcourir

Cet article vous présente principalement les informations pertinentes sur l'utilisation de Python pour explorer des articles sur un site Web en prose. L'introduction de l'article est très détaillée et a une certaine valeur de référence et d'apprentissage pour tous les amis qui en ont besoin peuvent y jeter un œil ci-dessous.

Cet article vous présente principalement le contenu pertinent sur les articles du réseau de prose d'exploration Python. Il est partagé pour votre référence et votre étude. Jetons un coup d'œil à l'introduction détaillée :

<.>Le rendu est le suivant :


Configurer python 2.7


 bs4

 requests
Installer à l'aide de pip

sudo pip install bs4


sudo pip install requests
Une brève explication de l'utilisation de bs4. Puisqu'il explore des pages Web, j'ai une brève explication de l'utilisation de bs4. présentera find et find_all.

La différence entre find et find_all est que ce qui est renvoyé est différent. 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 :


Ensuite, le code de test.py est :
<html>
<head>
</head>
<body>
<p id="one"><a></a></p>
<p id="two"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >abc</a></p>
<p id="three"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a></p>
<p id="four"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >four<p>four p</p><p>four p</p><p>four p</p> a</a></p>
</body>
</html>


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. .
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;p&#39;)
 print s.find_all(&#39;p&#39;)
 print "------------------------------"
 print s.find(&#39;p&#39;,id=&#39;one&#39;)
 print s.find_all(&#39;p&#39;,id=&#39;one&#39;)
 print "------------------------------"
 print s.find(&#39;p&#39;,id="two")
 print s.find_all(&#39;p&#39;,id="two")
 print "------------------------------"
 print s.find(&#39;p&#39;,id="three")
 print s.find_all(&#39;p&#39;,id="three")
 print "------------------------------"
 print s.find(&#39;p&#39;,id="four")
 print s.find_all(&#39;p&#39;,id="four")
 print "------------------------------"


Nous devons donc faire attention à ce que nous voulons lors de son utilisation, sinon une erreur se produira


L'étape suivante. est d'obtenir des informations sur la page Web via des demandes. Je ne comprends pas très bien les autres. Pourquoi écrire entendu et autres choses


J'accède directement à la page Web, j'obtiens plusieurs pages Web secondaires classées de Prose Network ? via la méthode get, puis passez un test de groupe pour explorer toutes les pages Web


Dans cette partie du code, je n'ai pas traité le
def get_html():
 url = "https://www.sanwen.net/"
 two_html = [&#39;sanwen&#39;,&#39;shige&#39;,&#39;zawen&#39;,&#39;suibi&#39;,&#39;rizhi&#39;,&#39;novel&#39;]
 for doc in two_html:
 i=1
  if doc==&#39;sanwen&#39;:
  print "running sanwen -----------------------------"
  if doc==&#39;shige&#39;:
  print "running shige ------------------------------"
  if doc==&#39;zawen&#39;:
  print &#39;running zawen -------------------------------&#39;
  if doc==&#39;suibi&#39;:
  print &#39;running suibi -------------------------------&#39;
  if doc==&#39;rizhi&#39;:
  print &#39;running ruzhi -------------------------------&#39;
  if doc==&#39;nove&#39;:
  print &#39;running xiaoxiaoshuo -------------------------&#39;
 while(i<10):
 par = {&#39;p&#39;:i}
 res = requests.get(url+doc+&#39;/&#39;,params=par)
 if res.status_code==200:
  soup(res.text)
  i+=i
. ce 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/rizhi/&p=1

res.status_code
La valeur maximale de p est de 10. Je ne comprends pas. La dernière fois que j'ai exploré le disque, il y avait 100 pages. . Oubliez-le et analysez-le 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, vous analysez l'auteur et le titre. Le code est comme ça


Il y a un. chose de 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.
def soup(html_text):
 s = BeautifulSoup(html_text,&#39;lxml&#39;)
 link = s.find(&#39;p&#39;,class_=&#39;categorylist&#39;).find_all(&#39;li&#39;)
 for i in link:
 if i!=s.find(&#39;li&#39;,class_=&#39;page&#39;):
 title = i.find_all(&#39;a&#39;)[1]
 author = i.find_all(&#39;a&#39;)[2].text
 url = title.attrs[&#39;href&#39;]
 sign = re.compile(r&#39;(//)|/&#39;)
 match = sign.search(title.text)
 file_name = title.text
 if match:
 file_name = sign.sub(&#39;a&#39;,str(title.text))


La dernière étape consiste à obtenir le contenu en prose. Grâce à l'analyse de chaque page, nous obtenons l'adresse de l'article, puis obtenons directement le contenu. Je voulais à l'origine l'obtenir un par un en le modifiant. l'adresse Web, ce qui évite des ennuis.


Enfin, écrivez le fichier et enregistrez-le ok
def get_content(url):
 res = requests.get(&#39;https://www.sanwen.net&#39;+url)
 if res.status_code==200:
 soup = BeautifulSoup(res.text,&#39;lxml&#39;)
 contents = soup.find(&#39;p&#39;,class_=&#39;content&#39;).find_all(&#39;p&#39;)
 content = &#39;&#39;
 for i in contents:
 content+=i.text+&#39;\n&#39;
 return content


Trois fonctions pour obtenir le réseau de prose Prose, mais il y a un problème. Le problème est que je ne sais pas pourquoi une certaine prose est perdue. Je ne peux obtenir qu'environ 400 articles. C'est très différent des articles sur Prose.com, mais c'est effectivement obtenu. page par page. J'espère que quelqu'un pourra m'aider avec ce problème. 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+&#39;.txt&#39;,&#39;w&#39;)

 print &#39;running w txt&#39;+file_name+&#39;.txt&#39;
 f.write(title.text+&#39;\n&#39;)
 f.write(author+&#39;\n&#39;)
 content=get_content(url) 
 f.write(content)
 f.close()


J'ai presque oublié le rendu.
 f = open(file_name+&#39;.txt&#39;,&#39;w&#39;)
 print &#39;running w txt&#39;+file_name+&#39;.txt&#39;
 f.write(title.text+&#39;\n&#39;)
 f.write(author+&#39;\n&#39;)
 content=get_content(url) 
 f.write(content)
 f.close()


Il peut y avoir un phénomène de timeout. Je peux seulement dire que vous devez choisir une bonne connexion Internet lorsque vous allez à l'université !

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