2015-11-10 18 views
1

如何在使用python 3和beautifulsoup时使用相同的排列方式来获取所有文本4.我尝试了一个for循环,但没有奏效。如何从HTML数据中获取文本?

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标签?

+0

你的意思是你要正确的彩色打印?你的输出有两次蓝色,你的输出有蓝色和绿色。或者你的意思是你想从你的打印中删除HTML标签? – SuperBiasedMan

+1

两者。删除HTML标签并获取正确的输出 –

回答

0

首先,你的问题是,你只是使用soup.find获得第一个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) 

你可能会得到不必要的空格这种方式和我一样,但你可以用分割分开的话由空格,然后使用'\n'.join重新加入它作为一个字符串:

 print ('\n'.join(body.text.split()))