我已经用此代码解析了表
response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html, 'html.parser')
table = soup.find("table", attrs={"class":"table table-condensed table-bordered"})
datasets = []
for row in table.find_all("tr")[1:]:
dataset = (td.get_text() for td in row.find_all("td"))
print (tuple(dataset))
datasets.append(dataset)
print("___________________________________\n")
print(tuple(dataset))
print("___________________________________\n")
print("parsing\n")
它给出了
('A1 ', '- ', '- ', '- ', '- ', ' -\n ')
('A2', '- ', '- ', '- ', '- ', ' -\n ')
('A3', '- ', '- ', '- ', '- ', ' -\n ')
('A4', ' 1 W ', ' 50.1 Hz ', ' 0 V ', ' 24 °C ', ' 2018-09-12 19:05:49\n ')
('A5', ' 1 W ', ' 0 V ')
结果数据集为空
()
我想将结果存储在Array中,这样我就可以访问每一行/列,但是 找出来
if datasets[3][0]=='A4' print (datasets[3][2])
为什么如果我更改代码并删除打印(元组(数据集)),代码会更好地工作(尽管不是我期望的那样),但是我可以填充数据集,而不能像以前那样是空的数据集:
datasets = []
for row in table.find_all("tr")[1:]:
#dataset = dict(zip(headings, (td.get_text() for td in row.find_all("td"))))
dataset = (td.get_text() for td in row.find_all("td"))
datasets.append(dataset)
#print (tuple(dataset))
print("___________________________________\n")
print(list(datasets[3]))
print(list(datasets[4]))
答案 0 :(得分:1)
问题在于该语句:
dataset = (td.get_text() for td in row.find_all("td"))
返回生成器表达式。从某种意义上说,这就像一个迭代器,一旦您迭代到最后,您将消耗掉生成器。进一步访问生成器将不会再返回任何内容。
当您将数据集的内容打印为元组时,这将消耗数据,因此当您追加时,将一无所有。删除打印语句会使您离得更近,但是您仍在使用生成器,而您想要的是实际数据。
现在,尝试将上面的行更改为:
dataset = tuple(td.get_text() for td in row.find_all("td"))
或者只是将封闭的()更改为[]以使其成为列表理解:
dataset = [td.get_text() for td in row.find_all("td")]
这将使用生成器表达式,但会为您提供元组或列表中的数据值,您可以一次又一次地访问它们。将数据集元组添加到数据集时,它将包含您感兴趣的值。