2015-07-19 7 views
0

Я пытаюсь очистить http://www.virginiaequestrian.com/main.cfm?action=greenpages&GPType=8 для всех его табличных значений и поместить значения в список списков. По какой-то причине я не могу понять. Добавление info dict в список данных помещает только одно значение 364 раза (длина таблицы). Я печатал каждую строку и значение отдельно в цикле, и я знаю, что я захватываю правильные элементы/значение, но все, кажется, ломается, когда я пытаюсь поместить значения в список данных.Почему этот список возвращает одинаковые значения?

Может кто-нибудь, пожалуйста, скажите мне, когда я ошибаюсь?

from bs4 import BeautifulSoup 
import requests 

r=requests.get('http://www.virginiaequestrian.com/main.cfm?action=greenpages&GPType=8') 
soup=BeautifulSoup(r.content,'html5lib') 

data = [] 
info = {} 

tbl = soup.findAll('table')[2] 
for tr in tbl.findAll('tr')[3:]: 
    for td in tr.findAll('td')[0]: 
     value= td.string 
     info['Name']=value 
    for td in tr.findAll('td')[1]: 
     value= td.string 
     info['City']=value 
    for td in tr.findAll('td')[2]: 
     value= td.string 
     info['Phone']=value 
    for td in tr.findAll('td')[3]: 
     value = "http://www.virginiaequestrian.com/{}".format(td.a['href']) 
     info['ListURL']=value 
     data.append(info) 
print data 
+0

Вы наполняя 'data' с * сотни ссылок на точный словарь * ... – jonrsharpe

+0

Да, я понял. Я просил попытаться выяснить, что я могу сделать, чтобы исправить это. – user3590113

ответ

2

Объекты в Python (как ваш info Словарь) используют ссылки на свои базовые структуры данных. То, что вы обычно делаете при вызове data.append(info), снова и снова добавляет одну и ту же ссылку на один и тот же dict.

Что вы можете сделать, это либо (вос) создать info Dict на каждой итерации первейшая для цикла:

for tr in tbl.findAll('tr')[3:]: 
    info = {} 
    ... 

или добавить копию Dict в списке:

data.append(info.copy()) 

каждый раз создавая новый объект.


Вы также можете упростить ваш внутренний обмен на петлях, как Перебор одно значение не является действительно необходимым:

for td in tr.findAll('td')[0]: 
    value= td.string 
    info['Name']=value 
for td in tr.findAll('td')[1]: 
    value= td.string 
    info['City']=value 
for td in tr.findAll('td')[2]: 
    value= td.string 
    info['Phone']=value 
for td in tr.findAll('td')[3]: 
    value = "http://www.virginiaequestrian.com/{}".format(td.a['href']) 
    info['ListURL']=value 

может стать

name, city, phone, url = tr.findAll('td')[:4] 
info['Name'] = name.string 
info['City'] = city.string 
info['Phone'] = phone.string 
info['ListURL'] = "http://www.virginiaequestrian.com/{}".format(url.a['href']) 
+0

... неизменяемые объекты, такие как кортежи и целые числа * также * использовать ссылки на их базовые структуры данных; * все * имена в Python являются ссылками. – jonrsharpe

+1

Вы правы, я пытался фразы что-то еще, но было добавлено два объяснения. Лучше ? –

+0

@Mathias Ettinger i закончил тем, что получил эту ошибку, когда я попытался запустить ваш второй код кода Traceback (последний последний звонок): Файл «DadFile.py», строка 12, в Имя, город, телефон, адрес в tr.findAll ('td') [: 4] NameError: имя 'Name' не определено – user3590113

Смежные вопросы