注意事項
1、測試工具pycharm,請自行安裝,
2、python3.x
3、需要導入requests庫和bs4庫
4、項目目錄結構
run.py
# -*- coding: utf-8 -*- import rentspider if __name__ == '__main__': rentspider.run()
rentspider.py
# -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup def acc_page_msg(page_url): web_data = requests.get(page_url).content.decode('utf-8') soup = BeautifulSoup(web_data, 'html.parser') print(soup.title.string)#這里就是要填寫的測試內容 def get_pages_urls(): urls = [] urls.append('http://www.xxx.com/test.asp') return urls def run(): url_list = get_pages_urls() for url in url_list: acc_page_msg(url)
測試開始~~~~~~~~~
標簽選擇器
示例代碼:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>title-name</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <p name="one-name">
<b>one-one</b>
<b>one-two</b>
</p> <p name="two-name">two</p> </body> </html>
print(soup.title)#將title標簽里的代碼,含title print(soup.head)#獲取head標簽內代碼,含head print(soup.p)#獲取第一個p標簽代碼,含p print(soup.title.name)#獲取標簽的名稱,如這個顯示為title標簽
print(soup.p.attrs['name'])#獲取p標簽的name屬性的值 print(soup.p['name'])#等同與上一條指令
print(soup.p.string)#獲取標簽p內的內容,不含p print(soup.head.title.string)#層層迭代,獲取head標簽里的title標簽里的文本 #獲取p標簽里的所有子節點,以list保存 print(soup.p.contents)#獲取p標簽里的所有子節點,以list保存 #獲取p標簽里的所有子節點,以迭代輸出 print(soup.p.children) for i, child in enumerate(soup.p.children): print(i, child) #獲取p標簽里的所有子節點以及子孫節點(子節點對應的子節點) print(soup.p.descendants) for i, child in enumerate(soup.p.descendants): print(i, child) #獲取標簽的父節點(前一級的節點) print(soup.a.parent) #獲取標簽所有的祖先節點(父節點的父節點的父節點。。。直到最頂層(把整個文檔輸出)) print(list(enumerate(soup.a.parents))) #兄弟節點 print(list(enumerate(soup.a.next_siblings))) print(list(enumerate(soup.a.previous_siblings)))
標准選擇器
示例代碼如下:
<div class="panel"> <div class="panel-heading"> <h4>Hello</h4> </div> <div class="panel-body"> <ul class="list" id="list-1"> <li class="element">Foo</li> <li class="element">Bar</li> <li class="element">Jay</li> </ul> <ul class="list list-small" id="list-2"> <li class="element">Foo</li> <li class="element">Bar</li> </ul> </div> </div>
1,find_all方法
find_all( name , attrs , recursive , text , **kwargs )
可根據標簽名、屬性、內容查找文檔
name(標簽名字選擇)
print(soup.find_all('ul'))#查詢所有便簽為ul的元素 print(type(soup.find_all('ul')[0]))
# 嵌套搜索
for ul in soup.find_all('ul'): print(ul.find_all('li'))
attr(標簽的屬性選擇)
print(soup.find_all(attrs={'id': 'list-1'})) print(soup.find_all(attrs={'name': 'elements'}))
print(soup.find_all(id='list-1')) #只選擇element屬性的內容, 注意樣式class與關鍵字重復,故用class_ print(soup.find_all(class_='element'))
text(文本選擇)
print(soup.find_all(text='Foo'))
2、find方法
find( name , attrs , recursive , text , **kwargs )
find返回單個元素,find_all返回所有元素
print(soup.find('ul')) print(type(soup.find('ul'))) print(soup.find('page'))
3,其他的一些find方法
find_parents() find_parent()
find_parents()返回所有祖先節點,find_parent()返回直接父節點。
find_next_siblings() find_next_sibling()
find_next_siblings()返回后面所有兄弟節點,find_next_sibling()返回后面第一個兄弟節點。
find_previous_siblings() find_previous_sibling()
find_previous_siblings()返回前面所有兄弟節點,find_previous_sibling()返回前面第一個兄弟節點。
find_all_next() find_next()
find_all_next()返回節點后所有符合條件的節點, find_next()返回第一個符合條件的節點
find_all_previous() 和 find_previous()
find_all_previous()返回節點后所有符合條件的節點, find_previous()返回第一個符合條件的節點
CSS選擇器
通過select()直接傳入CSS選擇器即可完成選擇
示例代碼如下:
<div class="panel"> <div class="panel-heading"> <h4>Hello</h4> </div> <div class="panel-body"> <ul class="list" id="list-1"> <li class="element">Foo</li> <li class="element">Bar</li> <li class="element">Jay</li> </ul> <ul class="list list-small" id="list-2"> <li class="element">Foo</li> <li class="element">Bar</li> </ul> </div> </div>
1,基本語法
print(soup.select('.panel .panel-heading'))#選擇class的類型 print(soup.select('ul li'))#直接選擇標簽 print(soup.select('#list-2 .element'))#選擇id的類型 print(type(soup.select('ul')[0]))
2,層層迭代
for ul in soup.select('ul'): print(ul.select('li'))
3,獲取屬性
for ul in soup.select('ul'): print(ul['id'])#這兩種方法都能獲取標簽的屬性(id或其他) print(ul.attrs['id'])
4,獲取內容
for li in soup.select('li'): print(li.get_text())#輸出li里的內容