为什么这个列表 return 相同的值?

Why does this list return identical values?

我正在尝试抓取 http://www.virginiaequestrian.com/main.cfm?action=greenpages&GPType=8 的所有 table 值并将这些值放入列表列表中。出于某种原因,我似乎无法理解。将信息字典附加到数据列表中只会将一个值放入 364 次(table 的长度)。我在循环中分别打印了每一行和值,我知道我正在抓住正确的 elements/value,但是当我尝试将值放入数据列表时,一切似乎都崩溃了。

有人可以告诉我我做错了什么吗?

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

python 中的对象(如您的 info 字典)使用对其基础数据结构的引用。调用 data.append(info) 时你基本上在做的是一遍又一遍地将相同的引用附加到同一个字典。

你可以做的是在最外面的 for 循环的每次迭代中(重新)创建你的 info 字典:

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

或将您的字典的副本附加到您的列表中:

data.append(info.copy())

每次创建一个新对象。


您还可以简化内部 for 循环,因为实际上不需要迭代一个值:

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