无法将已解析的项目存储为字典

时间:2017-12-09 16:54:45

标签: python python-3.x dictionary web-scraping

我在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'}

4 个答案:

答案 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'))}