Beautifulsoup入门笔记(一)
2017-10-16 本文已影响0人
Cytosine
bsObj.findAll()
BeautifulSoup库里的对象
- BeautifulSoup对象
- 标签Tag对象:通过
find
、findAll
、直接调用子标签 - NavigableString对象:标签里的文字
- Comment对象:用于查找HTML文档的注释
处理
处理子标签和其他后代标签
from urllib.request import urlopen
from bs4 import BeautifulSoup
def main():
html = urlopen('http://www.pythonscraping.com/pages/page3.html')
bsObj = BeautifulSoup(html, 'lxml')
for child in bsObj.find('table', {'id':'giftList'}).children:
print(child)
if __name__ == '__main__':
main()
处理兄弟标签
对象不能把自己作为兄弟标签。任何时候你获取一个标签的兄
弟标签,都不会包含这个标签本身。其次,这个函数只调用后面的兄弟标签。例如,如果我们选择一组标签中位于中间位置的一个标签,然后用 next_siblings() 函数,那么它就只会返回在它后面的兄弟标签。
如果想让你的爬虫更稳定,最好还是让
标签的选择更加具体。如果有属性,就利用标签的属性。
获取标签属性
myTag.attrs
返回一个字典,所以myImgTag.attrs['src']
获取图片资源位置
Lambda
BeautifulSoup 允许我们把特定函数类型当作 findAll 函数的参数。唯一的限制条件是这些
函数必须把一个标签作为参数且返回结果是布尔类型。BeautifulSoup 用这个函数来评估它
遇到的每个标签对象,最后把评估结果为“真”的标签保留,把其他标签剔除。
例如,下面的代码就是获取有两个属性的标签:
soup.findAll(lambda tag: len(tag.attrs) == 2)
这行代码会找出下面的标签:
<div class="body" id="content"></div>
<span style="color:red" class="title"></span>
如果你愿意多写一点儿代码,那么在 BeautifulSoup 里用 Lambda 表达式选择标签,将是正则表达式的完美替代方案。
(摘自《Python网络数据采集》)
其他库
- lxml,http://lxml.de/,可以用来解析 HTML 和 XML 文档
- HTML parser,Python自带的