【问题标题】:BeatifulSoup - Trying to get text inside span tagsBeautifulSoup - 试图在跨度标签内获取文本
【发布时间】:2018-10-30 01:31:00
【问题描述】:

我想在 span 标签中提取文本,但是当我尝试使用 .text 或 get_text() 时出现错误(在 print spans 之后或在 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>

【问题讨论】:

    标签: html text beautifulsoup


    【解决方案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())
    

    【讨论】:

    • 谢谢。第二个建议似乎给了我重复的输出。见下文 Alisson Ramses Becker,02/10/1992,巴西,利物浦,Alisson Ramses Becker,02/10/1992,巴西,利物浦,.此外,第二个 div 仅将第一行作为我需要的跨度,然后第二和第三行仅包含 p 标签,我需要该数据。
    • 听起来你只想要冒号后面的值。如果是这种情况,您可以找到段落标签,然后在冒号上拆分文本。在上面的答案中查看我的编辑。
    【解决方案2】:

    凯尔的回答很好,但是为了避免像你所说的那样多次打印相同的值,你需要稍微改变一下逻辑。首先,您解析并将找到的所有匹配项添加到列表中,然后循环遍历列表中的所有匹配项并打印它们。 您可能需要考虑的另一件事是这个问题:

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

    通过使用列表而不是立即打印,您可以处理与任何现有记录相同的任何匹配项 在上面的 html 示例中,您可以看到如何将跨度添加两次,以及如何在 Kyle 建议的答案中找到匹配项。这一切都是为了确保您创建一个只会找到您需要的匹配项的逻辑。你如何做通常/总是取决于 html 的格式,但创造性也很重要! 祝你好运。

    【讨论】:

    • 感谢您的回答。你能举个例子说明我将如何立即使用该列表吗?我已经得到了我现在需要的东西。基本上在一个循环中从 div1 + div 2 获得跨度,然后转到下一个 div 并获取 p、标签并剥离文本(在 kyles 回答的帮助下)。当我进行查找全部并将其分配给 s 字符串并检查类型时,它的类型为 。例如 - spans = div.find_all('span') 现在是 span 一个列表,还是我需要做其他事情才能使其成为正确的列表?
    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多