Python Crawler
今天的課是學怎麼去爬表格的資料,作法上跟之前在寫ASP.NET的時候處理GridView差不多,果然是萬變不離其宗!
假如網頁畫面如下:
項次 | 項目 | 價格 | 連結 |
1 | 國文 | 1200 | http://123.com |
2 | 英文 | 1800 | http://123.com |
3 | 數學 | 1500 | http://123.com |
4 | 理化 | 2000 | http://123.com |
首先,一樣要先透過requests.get連到該目標網址,然後一樣丟給了BeauitfulSoup去處理!
resp = requests.get('目標網址') soup = BeautifulSoup(resp.text, 'html.parser')
tr就跟row一樣,所以先取tr資料
rows = soup.find('table', 'table').tbody.find_all('tr')
然後就透過迴圈去把所有tr的價格資料取出,價格td在第三欄,以index來計算的話是2。
(註:目前只有遇到generol的index是從1開始@@)
for row in rows:
price = row.find_all('td')[2].text
基本上,這樣子就可以取得price了。
如果有想要換平均課程價格的話,那就可以先宣告一個list
prices = []
然後在迴圈中append進去
for row in rows:
price = row.find_all('td')[2].text
prices.append(int(price))
總金額
sum(prices)
len(prices)課程數
python的list加總真的很方便!
另一種作法的話,就是透過tag的父子兄關係去做定位。
table
tr
td
td
td價格
td連結
a
我們可以從『a』這個tag去找他爸『td連結』再找他兄弟『td價格』
這時候的作法就變成先取得『a』的定位
links = soup.find_all('a')接著透過『a』來找他的父兄
for link in links:
price=link.parent.previous_sibling.text
.parent(父).previous_sibling(兄) 作法上跟處理一些網頁是一樣的。
如果要把所有的表格資料列印出來的話,作法是一樣的。
rows = soup.find('table','table').find_all('tr') # 先取得所有的tr資料
for row in rows:
#另一種取得所有td的方式
#all_tds = [td for td in row.children]
all_tds = row.find_all('td') # 取得所有的td
print(all_tds[0].text..XXXX) # 透過index去取值即可
當然了,如果有時候連結沒有放上去的話,那就會造成異常,所以需要防呆!
rows = soup.find('table','table').find_all('tr') # 先取得所有的tr資料for row in rows:all_tds = row.find_all('td') # 取得所有的tdif 'href' in all_tds[3].a.attrs: # 確認href是否存在href = all_tds[3].a['href']else:href = Noneprint(all_tds[0].text..XXXX) # 透過index去取值即可
另一種作法的話就是可以透過stripped_strings來處理!
rows = soup.find('table','table').find_all('tr') # 先取得所有的tr資料
for row in rows:
print([s for s in row.stripped_strings])
s for s in subsets 就等於
ss = []
for s in subsets(s):
ss.apped(s)
沒有留言:
張貼留言