我试图在Hotstar
上搜集热门英语电影的数据我下载了html源代码,我这样做:
from bs4 import BeautifulSoup as soup
page_soup = soup(open('hotstar.html'),'html.parser')
containers = page_soup.findAll("div",{"class":"col-xs-6 col-sm-4 col-md-3 col-lg-3 ng-scope"})
container = containers[0]
# To get video link
container.div.hs-cards-directive.article.a
此时我收到错误:
NameError: name 'cards' is not defined
这些是html文件的前几行:
<div bindonce="" class="col-xs-6 col-sm-4 col-md-3 col-lg-3 ng-scope" ng-repeat="slides in gridcardData">
<hs-cards-directive cdata="slides" class="ng-isolate-scope" renderingdone="shownCard()">
<article class="card show-card" ng-class="{'live-sport-card':isLiveSportCard, 'card-active':btnRemoveShow,'tounament-tray-card':record.isTournament}" ng-click="cardeventhandler({cardrecord:record})" ng-init="init()" pdata="record" removecard="removecard" watched="watched">
<a href="http://www.hotstar.com/movies/step-up-revolution/1770016594" ng-href="/movies/step-up-revolution/1770016594" restrict-anchor="">
请帮帮我! 我在Windows上使用Python 3.6.3。
答案 0 :(得分:2)
正如文档的Going down部分(松散地)解释的那样,tag.descendant
语法只是tag.find('descendant')
的便捷快捷方式。
如果您的标签名称不是有效的Python标识符,则不能使用该快捷方式。 1 (同样,如果您的标签名称与BS4本身的方法冲突,比如<find>
标签。)
Python标识符只能包含字母,数字和下划线,而不能使用连字符。所以,当你写这个:
container.div.hs-cards-directive.article.a
... python像这个数学表达式一样解析它:
container.div.hs - cards - directive.article.a
BeautifulSoup的div
节点没有名为hs
的后代,但这没关系;它只返回None
。但是,您尝试从cards
中减去None
,然后获得NameError
。
无论如何,在这种情况下唯一的解决方案是不使用快捷方式并明确调用find
:
container.div.find('hs-cards-directive').article.a
或者,如果它对您的用例有意义,您可以跳到article
,因为快捷方式会找到任何后代,而不仅仅是直接子项:
container.div.article.a
但我不认为这适合你的情况;你只想要特定子节点下的文章,而不是所有可能的文章,对吗?
<子> 1。从技术上讲, 实际上可以使用快捷方式,它不再是一个快捷方式。如果您了解getattr(container.div, 'hs-cards-directive').article.a
的含义,那么您可以编写它并且它会起作用......但显然find
将更易读,更容易理解。