访问使用BeautifulSoup在html文件中使用连字符( - )分隔名称的类时出错

时间:2018-03-29 18:06:06

标签: python html html5 python-3.x beautifulsoup

我试图在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。

1 个答案:

答案 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将更易读,更容易理解。