a suivi les conseils et j'ai pu passer l'erreur d'origine, merci à tous pour l'instant :) je suis presque là où je veux être. semble avoir encore un énorme manque de connaissances en matière d'indentation. vous êtes vraiment un joyau pour la communauté de codage, merci beaucoup jusqu'à présent :)
Here is the current code that has passed those errors and its down to a warning, and not extracting anything.
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'https://dc.urbanturf.com/pipeline'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
pipeline_items = soup.find_all('div', attrs={'class': 'pipeline-item'})
rows = []
columns = ['Listing Title', 'Listing url', 'listing image url', 'location', 'Project type', 'Status', 'Size']
for item in pipeline_items:
# title, image url, listing url
listing_title = item.a['title']
listing_url = item.a['href']
listing_image_url = item.a.img['src']
for p_tag in item.find_all('p'):
if not p_tag.h2:
if p_tag.text == 'Location:':
p_tag.span.extract()
property_location = p_tag.text.strip()
elif p_tag.span.text == 'Project type:':
p_tag.span.extract()
property_type = p_tag.text.strip()
elif p_tag.span.text == 'Status:':
p_tag.span.extract()
property_status = p_tag.text.strip()
elif p_tag.span.text == 'Size:':
p_tag.span.extract()
property_size = p_tag.text.strip()
row = [listing_title, listing_url, listing_image_url, property_location, property_type, property_status, property_size]
rows.append(row)
df = pd.Dataframe(rows, columns=columns)
df.to_excel('DC Pipeline Properties.xlsx', index=False)
print('File Saved')
l'erreur que j'obtiens est la suivante im en utilisant pycharm 2020.2 est peut-être un mauvais choix?
row = [listing_title, listing_url, listing_image_url, property_location, property_type, property_status, property_size] NameError: le nom 'property_location' n'est pas défini
4 Réponses :
Il me semble que votre deuxième boucle for pour p_tag dans item.find_all ('p'): est en dehors de la portée de la première boucle for qui itère sur les éléments ... Ajoutez cela à le fait qu'il puisse y avoir 0 élément dans la 1ère boucle, vous obtenez un Aucun.
Il suffit de mettre la boucle for et son contenu dans la boucle for qui itère sur les éléments de pipeline_items.
Le problème est que
for item in pipeline_items:
renvoie une liste vide. Le résultat est que:
pipeline_items = soup.find_all('div', attrs={'class': 'pipline-item'})
Cela ne se produit jamais réellement. Pour cette raison, la valeur de item n'est jamais définie.
Je ne sais pas exactement ce que vous essayez de faire. Mais je vois deux solutions:
pour p_tag dans item.find_all ('p'): afin que vous l'exécutiez pour chaque élément. De cette façon, s'il n'y a aucun élément, il n'est pas appelé (je pense que c'est ce que vous aviez l'intention de faire à l'origine?) item existe, et ignorez la boucle si ce n'est pas le cas. Qui copie le plus fidèlement ce que votre code est en train de faire, mais je ne pense pas que ce soit ce que vous voulez qu'il fasse. Le n ° 1 est presque certainement ce qui est prévu. Sinon, il s'agit simplement de traiter le dernier élément, donc la première boucle n'est pas nécessaire.
@Barmar on ne sait jamais;)
La ligne 17 et ci-dessous doit être à l'intérieur de la boucle for pour que "item" soit vu.
for item in pipeline_items:
# title, image url, listing url
listing_title = item.a['title']
listing_url = item.a['href']
listing_image_url = item.a.img['src']
for p_tag in item.find_all('p'): <------------Indent this for loop to be inside the previous for loop.
if not p_tag.h2:
if p_tag.text == 'Location:':
Mission accomplie grâce à tout le monde ici, Cheers! il me manquait peu de choses. 1 Indentation à coup sûr. 2 il me manquait un span sur la première sous-section - si p_tag.span.text == 'Location:': 3 il me manquait un package openpyxl qui a été appelé en bas pour écrire dans Excel.
100% de code fonctionnel ci-dessous, et ma promesse de m'améliorer et d'aider quand je peux :)
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'https://dc.urbanturf.com/pipeline'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
pipeline_items = soup.find_all('div', attrs={'class': 'pipeline-item'})
rows = []
columns = ['listing title', 'listing url', 'listing image url', 'location', 'Project type', 'Status', 'Size']
for item in pipeline_items:
# title, image url, listing url
listing_title = item.a['title']
listing_url = item.a['href']
listing_image_url = item.a.img['src']
for p_tag in item.find_all('p'):
if not p_tag.h2:
if p_tag.span.text == 'Location:':
p_tag.span.extract()
property_location = p_tag.text.strip()
elif p_tag.span.text == 'Project type:':
p_tag.span.extract()
property_type = p_tag.text.strip()
elif p_tag.span.text == 'Status:':
p_tag.span.extract()
property_status = p_tag.text.strip()
elif p_tag.span.text == 'Size:':
p_tag.span.extract()
property_size = p_tag.text.strip()
row = [listing_title, listing_url, listing_image_url, property_location, property_type, property_status, property_size]
rows.append(row)
df = pd.DataFrame(rows, columns=columns)
df.to_excel('DC Pipeline Properties.xlsx', index=False)
print('File Saved')
Pouvez-vous ajouter l'erreur?
Traceback (dernier appel en dernier): Fichier "C: /Users/scott/AppData/Roaming/JetBrains/PyCharm2020.2/scra tches / scratch_1.py", ligne 17, dans pour p_tag dans item.find_all ( 'p'): NameError: le nom 'item' n'est pas défini Processus terminé avec le code de sortie 1
la classe s'appelle-t-elle vraiment
pipline-itemou est-ce une faute de frappe?Scott, pourriez-vous modifier votre message et y publier le traçage dans un bloc de code?