我一直在解析Rotten Tomatoes网站的一部分,该网站将评论家评分作为标记,并将“%”分开。我遵循了一些SO建议,例如使用find_all('span',text="true")
,但Python 3.5.1 shell返回了这个错误:AttributeError: 'NavigableString' object has no attribute 'find_all'
我也尝试找到Beautiful Soup对象critiscore
的直接子节点,但是收到了相同的错误。请告诉我哪里出错了。这是我的python代码:
def get_rating(address):
"""pull ratings numbers from rotten tomatoes"""
RTaddress = urllib.request.urlopen(address)
tomatoe = BeautifulSoup(RTaddress, "lxml")
for criticscore in tomatoe.find('span', class_=['meter-value superPageFontColor']):
print(''.join(criticscore.find_all('span', recursive=False))) #print the Tomatometer
另外,这里是关于烂番茄的代码我很感兴趣:
<div class="critic-score meter">
<a href="#contentReviews" class="unstyled articleLink" id="tomato_meter_link">
<span class="meter-tomato icon big medium-xs certified_fresh pull-left"></span>
<span class="meter-value superPageFontColor"><span>96</span>%</span>
</a>
</div>
答案 0 :(得分:2)
问题在于:
for criticscore in tomatoe.find('span', class_=['meter-value superPageFontColor']):
在这里,您通过find()
定位单个元素,然后遍历其子节点,子节点可以是文本节点以及其他元素(当您遍历元素时,这是{{1 }})。
相反,您可能打算使用BeautifulSoup
代替find_all()
:
find()
或者,您可以使用单个CSS selector代替:
for criticscore in tomatoe.find_all('span', class_=['meter-value superPageFontColor']):
其中for criticscore in tomatoe.select('span.meter-value > span'):
print(criticscore.get_text())
表示直接的父子关系(这是您的>
替换)。