NameError: имя "Item" не определено - PullRequest
0 голосов
/ 05 августа 2020

последовал совету, и я смог передать исходную ошибку, спасибо вам всем до сих пор :) Я почти там, где хочу быть. Кажется, у меня все еще огромный пробел в знаниях, когда дело доходит до отступов. вы, ребята, поистине жемчужина для сообщества программистов, большое вам спасибо :)

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')

ошибка, которую я получаю, заключается в следующем: я использую pycharm 2020.2, может быть, это плохой выбор? 1005 * row = [название_список, url_перечисления, URL_образа_предложения, расположение_свойства, тип_свойства, статус_свойства, размер_свойства] NameError: имя 'расположение_свойства' не определено

Ответы [ 4 ]

1 голос
/ 05 августа 2020

Проблема в том, что

pipeline_items = soup.find_all('div', attrs={'class': 'pipline-item'}) 

возвращает пустой список. В результате:

for item in pipeline_items:

На самом деле никогда не происходит. Из-за этого значение item никогда не определяется.

Я не совсем уверен, что вы пытаетесь сделать. Но я вижу два решения:

  1. Отступ for p_tag in item.find_all('p'):, чтобы вы выполняли его для каждого элемента. Таким образом, если элементов нет, он не вызывается (я думаю, это именно то, что вы намеревались сделать изначально?)
  2. Добавьте оператор if перед l oop, чтобы проверить, существует ли item, и пропустите l oop, если это не так. Которые наиболее точно копируют то, что ваш код делает в настоящее время, но я не думаю, что вы этого хотите.
1 голос
/ 05 августа 2020

Мне кажется, что ваш второй для l oop for p_tag in item.find_all('p'): выходит за рамки 1-го для l oop, который выполняет итерацию по элементам ... Добавьте это к тому факту, что в 1-м l может быть 0 элементов oop, вы получите None.

Просто поместите for l oop и его содержимое внутри for l oop, которое выполняет итерацию по элементам в pipeline_items.

0 голосов
/ 05 августа 2020

Миссия выполнена, спасибо всем присутствующим, Ура! несколько вещей, которые мне не хватало. 1 Отступы точно. 2 мне не хватало диапазона в первом подразделе - если p_tag.span.text == 'Location:': 3 мне не хватало пакета openpyxl, который был вызван внизу для записи в excel.

100 % рабочий код ниже, и я обещаю поправиться и помочь, когда смогу:)

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')
0 голосов
/ 05 августа 2020

Строка 17 и ниже должна быть внутри l oop, чтобы 'элемент' был виден.

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:':
...