BeatifulSoup-尝试在span标签内获取文本

时间:2018-10-30 01:31:00

标签: html text beautifulsoup

我想将文本拉到span标记内,但是当我尝试使用.text或get_text()时,出现错误(在打印span之后或for循环中)。我想念什么?我已经设置好了,只对类col的第一个div进行了此操作,只是为了测试它是否正常工作,但我希望它也可以在第二个上工作。

谢谢

我的代码-

premier_soup1 = player_soup.find('div', {'class': 'row-table details -bp30'})
premier_soup_tr = premier_soup1.find_all('div', {'class': 'col'})
for x in premier_soup_tr[0]:
    spans = x.find('span')
    print (spans)

输出

-1
<span itemprop="name">Alisson Ramses Becker</span>
-1
<span itemprop="birthDate">02/10/1992</span>
-1
<span itemprop="nationality"> Brazil</span>
-1
>>> 

HTML

<div class="col">
 <p>Name: <strong><span itemprop="name">Alisson Ramses Becker</span>    </strong></p>  
 <p>Date of birth:<span itemprop="birthDate">02/10/1992</span></p>
 <p>Place of birth:<span itemprop="nationality"> Brazil</span></p>               
  </div>      
 <div class="col">
<p>Club: <span itemprop="affiliation">Liverpool</span></p>
<p>Squad: 13</p><p>Position: Goal Keeper</p>
</div>

2 个答案:

答案 0 :(得分:1)

如果只需要跨度中的文本,则可以专门搜索跨度:

soup = BeautifulSoup(html, 'html.parser')
spans = soup.find_all('span')
for span in spans:
    print(span.text)

如果要查找具有特定div的跨度,则可以执行以下操作:

divs = soup.find_all( 'div', {'class': 'col'})
for div in divs:
    spans = div.find_all('span')
    for span in spans:
        print(span.text)

如果只需要冒号后的所有值,则可以搜索段落标签:

soup = BeautifulSoup(html, 'html.parser')
divs = soup.find_all( 'div', {'class': 'col'})
for div in divs:
    ps = div.find_all('p')
    for p in ps:
        print(p.text.split(":")[1].strip())

答案 1 :(得分:1)

Kyle的答案很好,但是要避免像您说的那样多次打印相同的值,则需要稍微改变一下逻辑。首先,您解析所有找到的匹配项并将其添加到列表中,然后在列表中循环查找所有匹配项并进行打印。 您可能需要考虑的另一件事是这个问题:

<div class=col>
  <div class=col>
    <span/>
  </div>
</div>

通过使用列表而不是立即打印,您可以处理与任何现有记录相同的任何匹配项 在上面的html示例中,您可以看到如何将跨度添加两次,以及如何在Kyle建议的答案中找到匹配项。这就是确保您创建一个仅能找到所需匹配项的逻辑。您的操作方式经常(始终)取决于html的格式,但对创造力也很重要! 祝你好运。