2015-09-13 1 views
0

Python noob ici, alors n'hésitez pas à supposer que je ne sais rien.Scraper Listing immobilier: Comment extraire le nombre de chambres du titre de la liste?

Donc je construis ce web grattoir pour parcourir les annonces immobilières sur un certain site, les télécharger à partir d'un tas de pages (chaque page est un quartier différent), et tirer le prix et le nombre de chambres de la liste titre, en fin de compte mettre toutes ces choses dans une feuille Excel qui est facile pour moi de jouer avec. J'ai toutes ces choses qui fonctionnent, sauf pour le nombre de chambres à coucher. La plupart des listes utilisent l'un des quelques formats pour communiquer le nombre de chambres. Ainsi, par exemple, si une liste était un appartement d'une chambre, vous verriez l'une des chaînes suivantes dans le texte annonce:

  • 1br
  • 1/one br
  • 1/une chambre

Assez facile. Donc, je veux que cette section du script se passe, "Est-ce que le titre de la liste contient l'une de ces chaînes? Si oui, c'est appartement 1 chambre.Si pas, vérifiez pour voir si c'est un appartement de deux chambres.Si pas, vérifiez si C'est un appartement de 3 chambres, si ce n'est pas le cas, retournez un visage triste. "

Ma façon de garder le texte du titre avec le nombre de chambres est de faire un dictionnaire, où la clé est le texte du titre et la valeur est le nombre de chambres. Ce dictionnaire s'appelle bedDict.

Voici ce que j'ai essayé jusqu'à présent. Chose étrange est, il semble fonctionner, mais lors de l'inspection réelle, je vois qu'il y a beaucoup de résultats sont incompatibles. Un titre qui dit "Beautiful 80sqm apartment 2 br à proximité du métro!" par exemple dira "1 br" dans la colonne "Bedroom Count" de ma feuille de calcul.

La liste 'goodLinks' contient tous les titres que j'ai récupérés sur le site des petites annonces.

bedrooms = [] 
oneBrPat = ['1br', '1 br', '1 bedroom', 'one br', 'one bedroom'] 
twoBrPat = ['2br', '2 br', '2 bedroom', 'two br', 'two bedroom'] 
threeBrPat = ['3br', '3 br', '3 bedroom', 'three br', 'three bedroom'] 

print("Creating bedroom dictionary") 
bedDict = {} 
for b in goodLinks: 
    bedDict[b] = ":(" 
#Setting the "values" to "sadface" and then replacing them with bedroom count after a match is found. 
print("Beginning bedroom count") 
for a in goodLinks: 
    if a is not None: 
    for b in oneBrPat: 
     print(b) 
     if str(b) in str(a): 
      print (str(b)) 
      bedDict[a] = "1 br" 
for a in goodLinks: 
    if a is not None: 
    for b in twoBrPat: 
     print(b) 
     if str(b) in str(a): 
      print (str(b)) 
      bedDict[a] = "2 br" 
for a in goodLinks: 
    if a is not None: 
    for b in threeBrPat: 
     print(b) 
     if str(b) in str(a): 
      print (str(b)) 
      bedDict[a] = "3 br" 
print("Ending bedroom count") 

bedCount = bedDict.values() 

L'idée est alors que « bedCount » sera le nombre de chambres, dans l'ordre, qui sera mis dans la feuille Excel à côté des prix et titres liste. Le seul problème est que les résultats dans la feuille Excel ne correspondent pas avec les titres de poste réels. Qu'est-ce qui se passe avec ça?

Je peux montrer plus de code si nécessaire, mais le tout est de 172 lignes pour le moment.

Répondre

0

Je vous recommande d'utiliser une expression régulière pour quelque chose comme ceci, car elle pourrait être conçue pour répondre à d'autres variations dans votre liste d'entrées, par exemple des espaces supplémentaires entre les mots.

Ce qui suit devrait vous aider à démarrer:

import re 

tests = [ 
    "No bedrooms here", 
    "Beautiful 80sqm apartment 1 br close to the subway!", 
    "Beautiful 80sqm apartment one br close to the subway!", 
    "Beautiful 80sqm apartment 1 bedroom close to the subway!", 
    "Beautiful 80sqm apartment TWO br close to the subway!", 
    "Beautiful 80sqm apartment 2 bedrooms close to the subway!", 
    "Beautiful 80sqm apartment 3 br close to the subway!", 
    "Beautiful 80sqm apartment fOur br close to the subway!"] 

d_numbers = {'one' : 1, 'two' : 2, 'three' : 3, 'four' : 4} 

for test in tests: 
    re_count = re.search("\s(\d|one|two|three|four)\s*?(?:br|bedroom|bedrooms)\s", test, re.I) 

    if re_count: 
     bedrooms_text = re_count.group(1).lower() 

     try: 
      bedrooms = int(bedrooms_text) 
     except ValueError: 
      bedrooms = d_numbers[bedrooms_text] 

     print "Bedrooms:", bedrooms 
    else: 
     bedrooms = ':-(' 

    print "Bedrooms:", bedrooms 

Cela vous donne les résultats suivants:

Bedrooms: :-(
Bedrooms: 1 
Bedrooms: 1 
Bedrooms: 1 
Bedrooms: 1 
Bedrooms: 1 
Bedrooms: 1 
Bedrooms: 2 
Bedrooms: 2 
Bedrooms: 2 
Bedrooms: 2 
Bedrooms: 3 
Bedrooms: 3 
Bedrooms: 4 
Bedrooms: 4 

Il pourrait avoir besoin d'amélioration en fonction de votre jeu de données complet.