我用这段代码解析了表
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 ')
结果数据集为空
()
我想,但结果在一个数组,所以我可以访问每一行/列,但找出
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]))
问题是这句话:
dataset = (td.get_text() for td in row.find_all("td"))
返回生成器表达式。这有点像迭代器,在某种意义上说,一旦你迭代到最后,那么你将消耗生成器。进一步访问发电机不会再返回任何东西。
当您将数据集的内容作为元组打印时,这将消耗数据,因此当您进行追加时,没有任何内容。删除print语句可以让您更接近,但您仍在使用生成器,您想要的是实际数据。
现在,尝试将上面的行更改为:
dataset = tuple(td.get_text() for td in row.find_all("td"))
或者只是将封闭()更改为[],使其成为列表理解:
dataset = [td.get_text() for td in row.find_all("td")]
这将使用生成器表达式,但会为您提供元组或列表中的数据值,您可以反复访问它们。将数据集元组添加到数据集时,它将包含您感兴趣的值。