假设我想在每集节目中提取24分钟或在评级下提取N13信息。现在这只是代码的一部分,而某些span标记不包含dark_text
类,而是其他内容。但是当我查找持有评级的标签时,当我找到它时,我无法提取它的评分,因为N13
现在位于div
标签下,而不是span
,但是我正在寻找'评级'或'持续时间'我必须寻找'span'标签。并且美丽的汤不允许您findAll('div').findAll('span', {'class':'...'})
,因此如果找到我正在寻找的div
标记,我将无法返回span
标记。
当我执行for
循环时,会打印出所有这些额外的None
以及其他内容。
任何人都有关于如何解析这个问题的任何提示?
问题实际上就是如何查找位于<span>
标记下的div
标记中的内容,但一旦找到,则提取整个div
标记,或者最好甚至是仅在div
标记中,但不在span
标记中?事实证明这比我预想的要复杂得多。
from bs4 import BeautifulSoup
x= '''<div>
<a href="javascript:void(0);" onclick="$('#score143583').toggle()">Overall Rating</a>:
2
</div>
<div class="spaceit">
<span class="dark_text">Duration:</span>
24 min. per ep.
</div>
<div>
<span class="dark_text">Rating:</span>
N13
</div>'''
bs = BeautifulSoup(x, 'html.parser')
答案 0 :(得分:0)
您可以使用next_sibling
方法获取位于span
标记之后的文字。要获取span
标记,您可以使用find('span', class_='dark_text', text='Duration:')
。
创建一个简单的函数,你可以使用它:
def get_next_text(soup, text):
return soup.find('span', class_='dark_text', text=text).next_sibling
soup = BeautifulSoup(html, 'lxml')
duration = get_next_text(soup, 'Duration:')
print('Duration:', duration.strip())
rating = get_next_text(soup, 'Rating:')
print('Rating:', rating.strip())
输出:
Duration: 24 min. per ep.
Rating: N13
如果您想获得包含所需文字的整个div
标记,可以使用.parent
。
def get_parent(soup, text):
return soup.find('span', class_='dark_text', text=text).parent
soup = BeautifulSoup(html, 'lxml')
duration = get_parent(soup, 'Duration:')
print(duration)
rating = get_parent(soup, 'Rating:')
print(rating)
输出:
<div class="spaceit">
<span class="dark_text">Duration:</span>
24 min. per ep.
</div>
<div>
<span class="dark_text">Rating:</span>
N13
</div>