我在python中使用BeautifulSoup编写了一个小脚本来解析存储在下面脚本中的content
变量中的一些元素中的一些项目。我不希望将项目附加到先前创建的空字典中;相反,我希望在飞行中解析它。但是,我试过但却无法做到这一点。任何帮助都将受到高度赞赏。
这是我的尝试:
from bs4 import BeautifulSoup
content="""
<table class="data">
<tbody>
<tr class="blue">
<td>hot</td>
<td>cold</td>
</tr>
<tr>
<td>day</td>
<td>night</td>
</tr>
</tbody>
</table>
"""
soup = BeautifulSoup(content,'lxml')
for items in soup.select('tr'):
data = [item.text for item in items.select("td")]
dict_val = {data[0] : data[1]}
print(dict_val)
我获得输出的方式:
{'hot': 'cold'}
{'day': 'night'}
我期望获得输出的方式:
{'hot': 'cold','day': 'night'}
答案 0 :(得分:2)
您可以在for循环之外创建字典:
soup = BeautifulSoup(content,'lxml')
d = {}
for items in soup.select('tr'):
data = [item.text for item in items.select("td")]
d[data[0]] = data[1]
print(d)
或者,您可以在一行中创建字典:
from bs4 import BeautifulSoup as soup
s = [i.text for i in soup(content, 'lxml').findAll('td')]
new_s = dict([s[i:i+2] for i in range(0, len(s), 2)])
输出:
{u'hot': u'cold', u'day': u'night'}
答案 1 :(得分:0)
请记住,计算机只会完全按照您的说法进行操作。您的原始代码包含以下内容:
dict_val = {data[0] : data[1]}
每次循环迭代时都会创建一个新字典。相反,如果要创建单个字典并向其添加元素,则需要执行此操作。通常用文字写出步骤是有帮助的:
create a dictionary
for each row in the table:
parse the <td> elements from the row
add an entry to the dictionary
大部分内容已经翻译成Python。关键的区别在于创建字典的位置以及HTML中的数据如何插入字典中。我将在Python中留下如何执行此操作的详细信息。 (提示:看看另一个答案。)这里重要的是要清楚地思考你想要执行的步骤的顺序,然后然后找出如何在Python中完成它。
答案 2 :(得分:0)
您需要在for循环之前初始化字典,在每次迭代的代码中,在此行dict_val = {data[0] : data[1]}
中创建一个新字典。您可以尝试以下代码:
from bs4 import BeautifulSoup
content="""
<table class="data">
<tbody>
<tr class="blue">
<td>hot</td>
<td>cold</td>
</tr>
<tr>
<td>day</td>
<td>night</td>
</tr>
</tbody>
</table>
"""
soup = BeautifulSoup(content,'lxml')
dict_val = {}
for items in soup.select('tr'):
data = [item.text for item in items.select("td")]
dict_val[data[0]] = data[1]
print(dict_val)
答案 3 :(得分:0)
将nth-child与bs4 4.7.1和字典理解一起使用。特定于示例的解决方案,如图所示。
from bs4 import BeautifulSoup
content="""
<table class="data">
<tbody>
<tr class="blue">
<td>hot</td>
<td>cold</td>
</tr>
<tr>
<td>day</td>
<td>night</td>
</tr>
</tbody>
</table>
"""
soup = BeautifulSoup(content,'lxml')
result = {k.text:v.text for (k,v) in zip(soup.select('.data tr:nth-child(odd) td'), soup.select('.data tr:nth-child(even) td'))}