Comment puis-je tirerai des données spécifiques à partir d'une URL ouvert en Python en utilisant urllib2?

StackOverflow https://stackoverflow.com/questions/989872

  •  13-09-2019
  •  | 
  •  

Question

Je suis nouveau à Python et je jouer avec un robot faisant web très basique. Par exemple, je l'ai fait une fonction simple pour charger une page qui affiche les meilleurs scores pour un jeu en ligne. Je suis donc en mesure d'obtenir le code source de la page html, mais je dois tirer des chiffres précis à partir de cette page. Par exemple, la page Web ressemble à ceci:

http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13

où « bigdrizzle13 » est la partie unique du lien. Les chiffres sur cette page doivent être établis et retourné. Essentiellement, je veux construire un programme que tout ce que je dois faire est de taper « bigdrizzle13 » et il pourrait générer ces chiffres.

Était-ce utile?

La solution

Comme autre affiche mentionné, BeautifulSoup est un merveilleux outil pour ce travail.

Voici l'ensemble, le programme commenté avec ostentation-. Il pourrait utiliser beaucoup de tolérance d'erreur, mais aussi longtemps que vous entrez un nom d'utilisateur valide, il va tirer tous les scores de la page Web correspondante.

J'ai essayé de commenter aussi bien que possible. Si vous êtes nouveau à BeautifulSoup, je vous recommande fortement de travail par mon exemple avec le documentation BeautifulSoup à portée de main.

Le programme ...

from urllib2 import urlopen
from BeautifulSoup import BeautifulSoup
import sys

URL = "http://hiscore.runescape.com/hiscorepersonal.ws?user1=" + sys.argv[1]

# Grab page html, create BeatifulSoup object
html = urlopen(URL).read()
soup = BeautifulSoup(html)

# Grab the <table id="mini_player"> element
scores = soup.find('table', {'id':'mini_player'})

# Get a list of all the <tr>s in the table, skip the header row
rows = scores.findAll('tr')[1:]

# Helper function to return concatenation of all character data in an element
def parse_string(el):
   text = ''.join(el.findAll(text=True))
   return text.strip()

for row in rows:

   # Get all the text from the <td>s
   data = map(parse_string, row.findAll('td'))

   # Skip the first td, which is an image
   data = data[1:]

   # Do something with the data...
   print data

Et voici un essai.

> test.py bigdrizzle13
[u'Overall', u'87,417', u'1,784', u'78,772,017']
[u'Attack', u'140,903', u'88', u'4,509,031']
[u'Defence', u'123,057', u'85', u'3,449,751']
[u'Strength', u'325,883', u'84', u'3,057,628']
[u'Hitpoints', u'245,982', u'85', u'3,571,420']
[u'Ranged', u'583,645', u'71', u'856,428']
[u'Prayer', u'227,853', u'62', u'357,847']
[u'Magic', u'368,201', u'75', u'1,264,042']
[u'Cooking', u'34,754', u'99', u'13,192,745']
[u'Woodcutting', u'50,080', u'93', u'7,751,265']
[u'Fletching', u'53,269', u'99', u'13,051,939']
[u'Fishing', u'5,195', u'99', u'14,512,569']
[u'Firemaking', u'46,398', u'88', u'4,677,933']
[u'Crafting', u'328,268', u'62', u'343,143']
[u'Smithing', u'39,898', u'77', u'1,561,493']
[u'Mining', u'31,584', u'85', u'3,331,051']
[u'Herblore', u'247,149', u'52', u'135,215']
[u'Agility', u'225,869', u'60', u'276,753']
[u'Thieving', u'292,638', u'56', u'193,037']
[u'Slayer', u'113,245', u'73', u'998,607']
[u'Farming', u'204,608', u'51', u'115,507']
[u'Runecraft', u'38,369', u'71', u'880,789']
[u'Hunter', u'384,920', u'53', u'139,030']
[u'Construction', u'232,379', u'52', u'125,708']
[u'Summoning', u'87,236', u'64', u'419,086']

Voila:)

Autres conseils

Vous pouvez utiliser Belle soupe pour analyser le code HTML.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top