为什么这个列表 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'])
我正在尝试抓取 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'])