因工作需要,日常工作中有不少時間是用在了反復登陸內網。
故詳細研究測試了BeautifulSoup的用法,總結下來備用爬網頁之需。
首先是導入模塊並初始化了:
from bs4 import BeautifulSoup soup=BeautifulSoup(opener)
#1、tag標簽法
如果一層層的標簽包下去,只取每層標簽第一個,或只有唯一一個時,可以用
soup.head.title
但並行多個同名標簽的則不能title[2]之類查找
#2、contents法
根據文檔樹進行搜索,返回標記對象(tag)的列表,注意,直接.contents,返回的是列表,不是單一元素
使用contents向后遍歷樹,使用parent向前遍歷樹
共兩種用法:
soup.contents
soup.contents[x].contents
返回值是包含html標簽全部內容的列表。比如可能是三元素:[u'\n','<html>xxxx</html>',u'\n']
soup.contents[x]則是對列表各元素值的獲取了
soup.contents[x].contents
返回值是目標標簽的下一層(即為該標簽為父,則抓取到的都是子的列表)全部標簽的列表。這里如果x取錯,可能會導致
錯誤,因為取錯則生不成列表,后面contents會彈錯。
如
1 soup.contents[1]=u'HTML'
2 soup.contents[2]=u'\n'
3 soup.contents[3]=<html>...</html>
而
soup.contents[3].contents=[u'\n',<head>...</head>,u'\n',<body>...</body>,u'\n']
以此類推,soup.contents[3].contents[3]=肯定是上述列表中的第四個元素body。
#3、.next法
只能針對單一元素進行.next,或者說是對contents列表元素的挨個清點。
比如
soup.contents[1]=u'HTML' soup.contents[2]=u'\n'
則soup.contents[1].next等價於soup.contents[2]
#搜索法
find(name=None, attrs={}, recursive=True, text=None, **kwargs)
主要2個:.find('p'),.findAll('p')
find返回的是字符串值,而且是返回從頭查找到的第一個tag對。但是如果這第一個tag對包括大量的內容,父等級很高,則同時其內部所包含的
此級標簽也全部都find
findAll返回值是個列表,如果發現了一個同名標簽內含多個同名標簽,則內部的標簽一並歸於該父標簽顯示,列表其他元素也不再體現那些內含
的同名子標簽。
比如:
soup.findAll(onclick='document.location...') soup.findAll(attrs={'style':r'outline:none;'}) #用來查找屬性中有style='outline:none;的標簽體。
#4、.attrs[x]獲取屬性值法
在上述各種方法找到唯一的標簽體之后,可以通過對標簽實施attrs,得到一個內部屬性的列表。
在標簽后面新增.attrs['id']等等即可取得該標簽內部id的屬性值
比如:
soup.contents[3]==<meta abc='god' href='/'> soup.contents[3].attrs=={'abc':'god','href':'/'} soup.contents[3].attrs[1]='/'