Python解析表

问题描述 投票:0回答:1

我用这段代码解析了表

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]))
python-3.x parsing beautifulsoup
1个回答
1
投票

问题是这句话:

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

这将使用生成器表达式,但会为您提供元组或列表中的数据值,您可以反复访问它们。将数据集元组添加到数据集时,它将包含您感兴趣的值。

© www.soinside.com 2019 - 2024. All rights reserved.