1

如何在使用 python 3 和 beautifulsoup 4 时以相同的排列方式获取所有文本。我尝试了一个 for 循环,但它没有用。

from bs4 import BeautifulSoup

data = """
<body>
    <div id="Select">
        <h1 id="wall">
            First
        </h1>
    </div>

    </div>
        <div id="color_acts">
        <p id="acts_h">
        Choose
        </p>
        <p id="actshead">
        Color
        </p>
        <p id="acts">
        Blue
        </p>
    </div>

    <div id="Select">
        <h1 id="wall">
            Second
        </h1>
    </div>
    </div>
        <div id="color_acts">
        <p id="acts_h">
        Choose
        </p>
        <p id="actshead">
        Color
        </p>
        <p id="acts">
        Green
        </p>
    </div>
</body>
"""

soup = BeautifulSoup(data, "html.parser")

for Colors in soup.find_all('div', id='Select'):
    CC = Colors.find('h1').text
    print(CC)
    SS = soup.find('div', id='color_acts')
    print(SS)

我的输出:

            First

<div id="color_acts">
<p id="acts_h">
        Choose
        </p>
<p id="actshead">
        Color
        </p>
<p id="acts">
        Blue
        </p>
</div>

            Second

<div id="color_acts">
<p id="acts_h">
        Choose
        </p>
<p id="actshead">
        Color
        </p>
<p id="acts">
        Blue
        </p>
</div>

我的预期输出:

    First

Choose
Color
Blue

    Second

Choose
Color
Green

请注意,我的预期输出是蓝色然后是绿色,但实际输出只有两次蓝色。如何使输出具有正确的颜色并防止打印 html 标签?

4

1 回答 1

0

首先,您的问题是您只是soup.find用来获取具有 id 的第一个 div 'color_acts',这意味着它一直在寻找第一个 div。它永远不会以这种方式抓住第二个,因此您只需将蓝色作为颜色两次。你应该循环过去zip(soup.find_all('div', id='Select'), soup.find_all('div', id='color_acts'))。这样做意味着您可以找到所有 id 为“Select”和“color_acts”的 div,并同时遍历它们。然后您可以一起访问每个 div 并从中打印,如下所示:

for header, body in zip(soup.find_all('div', id='Select'),
                        soup.find_all('div', id='color_acts')):

现在,至于删除标签信息。你呼吁.text第一种情况,但不是第二种。您之前可能遇到过问题.text,但现在您有了 div,我们可以打印出来body.text

for header, body in zip(soup.find_all('div', id='Select'),
                        soup.find_all('div', id='color_acts')):
        print (header.find('h1').text)
        print (body.text)

您可能会像我一样以这种方式获得不必要的空格,但您可以使用 split 将单词按空格分隔,然后将'\n'.join其重新连接为单个字符串:

        print ('\n'.join(body.text.split()))
于 2015-11-10T11:47:11.160 回答