Python利用Beautiful Soup模块创建对象详解
安装
通过pip安装BeautifulSoup模块:pipinstallbeautifulsoup4。
还可以使用PyCharmIDE来写代码,在PyCharm中的Preferences中找到Project,在里面搜索BeautifulSoup模块,进行安装即可。
创建BeautifulSoup对象
BeautifulSoup模块广泛使用从网页中得到数据。我们能够使用BeautifulSoup模块从HTML/XML文档中提取任何数据,例如,网页中的所有链接或者标签内的内容。
为了实现这一点,BeautifulSoup提供了不同的对象和方法。任何的HTML/XML文档能够转化成不同的BeautifulSoup对象,这些对象有着不同的属性和方法,我们能够从中提取到需要的数据。
BeautifulSoup总共有如下三种对象:
- BeautifulSoup
- Tag
- NavigableString
创建BeautifulSoup对象
创建一个BeautifulSoup对象是任何BeautifulSoup工程的起点。
BeautifulSoup可以通过传一个字符串或者类文件对象(file-likeobject),例如机器上的文件或者网页。
通过字符串创建BeautifulSoup对象
在BeautifulSoup的构造器中通过传递一个字符串来创建对象。
helloworld='HelloWorld
' soup_string=BeautifulSoup(helloworld) printsoup_stringHelloWorld
通过类文件对象创建BeautifulSoup对象
在BeautifulSoup的构造器中通过传递一个类文件对象(file-likeobject)来创建对象。这在解析在线网页时非常有用。
url="http://www.glumes.com" page=urllib2.urlopen(url) soup=BeautifulSoup(page) printsoup
除了传递类文件对象之外,我们还可以传递本地文件对象到BeautifulSoup的构造器来生成对象。
withopen('foo.html','r')asfoo_file: soup_foo=BeautifulSoup(foo_file) printsoup_foo
为XML解析创建BeautifulSoup对象
BeautifulSoup模块同样能够用来解析XML。
当创建一个BeautifulSoup对象时,BeautifulSoup模块将会选择合适的TreeBuilder类来创建HTML/XML树。默认情况下,选择HTMLTreeBuilder对象,它将使用默认的HTML解析器,产生一个HTML结构树。在上面的代码中,由字符串生成BeautifulSoup对象,就是将它解析成了HTML树结构。
如果我们想要BeautifulSoup模块将输入的内容解析为XML类型,那么就需要在BeautifulSoup构造器中精确指定使用的features参数。通过特定的features参数,BeautifulSoup将会选择最适合的TreeBuilder类来满足我们想要的特征。
理解features参数
每一个TreeBuilder根据它使用的解析器将会有不同的特征。因此,输入的内容根据传递到构造器的features参数也会有不同的结果。
在BeautifulSoup模块中,TreeBuilder当前使用的解析器如下:
- lxml
- html5lib
- html.parser
BeautifulSoup构造器的features参数能够接受一个字符串列表或一个字符串值。
当前,每一个TreeBuilder支持的features参数和解析器如下表所示:
Features | TreeBuilder | Parser |
---|---|---|
[‘lxml','html','fast','permissive'] | LXMLTreeBuilder | lxml |
[‘html','html5lib','permissive','strict','html5′] | HTML5TreeBuilder | html5lib |
[‘html','strict','html.parser'] | HTMLParserTreeBuilder | html.parser |
[‘xml','lxml','permissive','fast'] | LXMLTreeBuilderForXML | lxml |
根据指定的feature参数,BeautifulSoup将会选择最合适的TreeBuilder类。如果在指定对应的解析器时,出现如下的报错信息,可能就是需要安装对应的解析器了。
bs4.FeatureNotFound:Couldn'tfindatreebuilderwiththefeaturesyourequested:html5lib. Doyouneedtoinstallaparserlibrary?
就HTML文档而言,选择TreeBuilder的顺序是基于解析器建立的优先级,就如上表格所示的优先级。首先是lxml,其次是html5lib,最后才是html.parser。例如,我们选择html字符串作为feature参数,那么如果lxml解析器可用,则BeautifulSoup模块将会选择LXMLTreeBuilder。如果lxml不可用,则会选择根据html5lib解析器选择HTML5TreeBuilder。如果在不可用,则会选择根据html.parser选择HTMLParserTreeBuilder了。
至于XML,由于lxml是唯一的解析器,所以LXMLTreeBuilderForXML总是会被选择的。
所以,为XML创建一个BeautifulSoup对象的代码如下:
helloworld='HelloWorld
' soup_string=BeautifulSoup(helloworld,features="xml") printsoup_string
输入的结果也是XML形式的文件:
在创建BeautifulSoup对象时,更好的实践是指定解析器。这是因为,不同的解析器解析的结果内容大不相同,尤其是在我们的HTML文档内容非法时,结果更为明显。
当我们创建一个BeautifulSoup对象时,Tag和NavigableString对象也就创建了。
创建Tag对象
我们可以从BeautifulSoup对象中得到Tag对象,也就是HTML/XML中的标签。
如下HTML代码所示:
#!/usr/bin/python #-*-coding:utf-8-*- frombs4importBeautifulSoup html_atag="""Testhtmlatagexample
Home Blog """ soup=BeautifulSoup(html_atag,'html.parser') atag=soup.a printtype(atag) printatag
从结果中可以看到atag的类型是
HTML/XML标签对象具有名称和属性。名称就是标签的名字,例如标签的名称就是a。属性则是标签的class、id、style等。Tag对象允许我们得到HTML标签的名称和属性。
Tag对象的名称
通过.name方式得到Tag对象的名称。
tagname=atag.name printtagname
同时也能够改变Tag对象的名称:
atag.name='p'