自从10号又是5天没更, 是, 我再一次断更... 原因是朋友在搞python, 老问我问题, 我python也是很久没碰了, 于是为了解决他的问题, 我只能重新开始研究python, 为了快速找回感觉, 我先是看了<简明python教程>, 出于兴趣考虑又开始看一本叫做<Web Scraping with Python>, 结果一发不可收拾, 直接把我的csapp扔在了一边, 真是太 ** 有意思了...
其中有几个很重要的库, 为了实行我的爬虫学习大计, 我准备先看BeautifulSoup的官方文档... 所以接下来就是关于BeautifulSoup官方文档的笔记 :
首先要知道BeautifulSoup是一个关于html解析(当然也有xml)的第三方库, 它能把html文件解析成为一棵树, 并且提供了很多强大的函数来帮助我们搜索其中的tags. 解析html所需要的解析库有这么几种 ...
官方建议lxml, 速度很快...
首先如何来生成一个BeautifulSoup的对象呢?
1 from bs4 import BeautifulSoup 2 3 soup = BeautifulSoup(open("index.html")) 4 5 soup = BeautifulSoup("<html>data</html>")
你可以传入字符串(str和bytes)或者是filehandle... 首先它将你输入的文档转为Unicode, 接着开始用指定的parser进行解析, 当然如果你不指定parser的话默认使用html.parser,
上面已经说了其实本质上生成的BeautifulSoup对象是一棵树, 其实总共只需要了解四个对象 ( Tag, NavigableString, BeautifulSoup, and Comment).
Tag :
学过html的话, tag就是html里面的tag... 下面是tag的一些属性和方法 :
name : 比如超链接的tag.name就是a, <a href="..."></a>, 另外有一点值得注意的是, 我们可以改动tag.name, 这将反应在所有由该个BeautifulSoup生成的html中.
1 tag.name = "blockquote" 2 tag 3 # <blockquote class="boldest">Extremely bold</blockquote>
attrs : tag里面有很多attributes(比如name例子中tag a 里面有个attribute是href), 在这里是以字典的形式出现的. 你可以自由的访问或者修改甚至删除它们.
1 tag.attrs 2 # {u'class': u'boldest'} 3 4 tag['class'] = 'verybold' 5 tag['id'] = 1 6 tag 7 # <blockquote class="verybold" id="1">Extremely bold</blockquote> 8 9 del tag['class'] 10 del tag['id'] 11 tag 12 # <blockquote>Extremely bold</blockquote> 13 14 tag['class'] 15 # KeyError: 'class' 16 print(tag.get('class')) 17 # None
当然我们还可能碰到一些有多个值的属性, 在这里是以list的形式出现的, 同时只有符合标准的属性能出现多个值, 对于不符合标准的属性即使出现多个值也当做一个值处理, 同时XML不支持多值属性...
1 css_soup = BeautifulSoup('<p class="body strikeout"></p>') 2 css_soup.p['class'] 3 # ["body", "strikeout"] 4 5 css_soup = BeautifulSoup('<p class="body"></p>') 6 css_soup.p['class'] 7 # ["body"] 8 9 id_soup = BeautifulSoup('<p id="my id"></p>') 10 id_soup.p['id'] 11 # 'my id' 12 13 rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>') 14 rel_soup.a['rel'] 15 # ['index'] 16 rel_soup.a['rel'] = ['index', 'contents'] 17 print(rel_soup.p) 18 # <p>Back to the <a rel="index contents">homepage</a></p> 19 20 xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml') 21 xml_soup.p['class'] 22 # u'body strikeout'