如何从 HTML 数据中获取文本?
How to get the text from HTML data?
如何在使用 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 标签?
首先,您的问题是您只是使用 soup.find
获取 ID 为 'color_acts'
的第一个 div,这意味着它一直在寻找第一个 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()))
如何在使用 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 标签?
首先,您的问题是您只是使用 soup.find
获取 ID 为 'color_acts'
的第一个 div,这意味着它一直在寻找第一个 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()))