Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html BeatifulSoup-尝试获取span标记内的文本_Html_Text_Beautifulsoup - Fatal编程技术网

Html BeatifulSoup-尝试获取span标记内的文本

Html BeatifulSoup-尝试获取span标记内的文本,html,text,beautifulsoup,Html,Text,Beautifulsoup,我想在span标记内提取文本,但当我尝试使用.text或get_text()时,会出现错误(在打印span之后或在for循环中)。我错过了什么?我刚刚设置了它,以便对col类的第一个div执行此操作,只是为了测试它是否工作,但我希望它也能对第二个div工作 谢谢 我的密码- premier_soup1 = player_soup.find('div', {'class': 'row-table details -bp30'}) premier_soup_tr = premier_soup1.fi

我想在span标记内提取文本,但当我尝试使用.text或get_text()时,会出现错误(在打印span之后或在for循环中)。我错过了什么?我刚刚设置了它,以便对col类的第一个div执行此操作,只是为了测试它是否工作,但我希望它也能对第二个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
>>> 
-1
艾莉森·拉美西斯·贝克尔
-1
02/10/1992
-1
巴西
-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>

姓名:Alisson Ramses Becker

出生日期:1992年10月2日

出生地:巴西 俱乐部:利物浦

阵容:13人位置:守门员


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

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())

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

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

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

谢谢。第二个建议似乎给了我重复的输出。见下页Alisson Ramses Becker,1992年10月2日,巴西,利物浦,Alisson Ramses Becker,1992年10月2日,巴西,利物浦。另外,第二个div只有第一行作为我需要的跨度,然后第二行和第三行只包含p标记,我需要这些数据。听起来你只需要冒号后面的值。如果是这样的话,您可以找到段落标记,然后在冒号上拆分文本。见我的编辑在上面的答案。谢谢你的回答。你能给我举个例子,说明我会如何立即使用这个列表吗?我现在得到了我需要的。基本上在一个循环中得到了div1+div2的跨度,然后转到下一个div,得到了p,标签,并剥离了文本(在kyles的帮助下)。当我执行“全部查找”并将其分配给s字符串并检查类型时,它的类型为。例如-span=div.find_all('span')现在是一个列表,还是我需要做些其他事情使其成为一个合适的列表?