1。查找同级子节点
from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj = BeautifulSoup(html,"lxml") # 查找同级子节点 for sibling in bsObj.find("table",{"id":"giftList"}).tr.next_siblings: print(sibling)
next_siblings可以查找所有同级节点,其它类似的方法还有next_sibling(只找下一个同级节点),previous_sibling(只找前一个同级节点),previous_siblings(找该节点前的所有同级节点)parent查找父节点,parents查找所有父节点
2。使用正则表达式过滤数据
from urllib.request import urlopen from bs4 import BeautifulSoup import re html = urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj = BeautifulSoup(html,"lxml") # 使用正则表达式匹配图片名 # 图片格式为:../img/gifts/img*.jpg images = bsObj.findAll("img",{"src":re.compile("\.\.\/img\/gifts\/img.*\.jpg")}) for image in images: print(image["src"]) print(bsObj.img.attrs)正则表达式可以只保留需要的图片文件名。
3。使用lambda过滤数据
from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj = BeautifulSoup(html,"lxml") # 使用lambda查找只有两个属性tag,有一个问题是tag的子节点也会保留,可以继续过滤 print(bsObj.findAll(lambda tag:len(tag.attrs)==2))
4。开始动真格的,从维基百科上爬取链接
from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon") bsObj = BeautifulSoup(html,"lxml") for link in bsObj.findAll("a"): if "href" in link.attrs: print(link.attrs["href"])
5。爬取数据前一定要分析html源码,方便过滤掉不相关的信息,后续处理会少很多工作量。
from urllib.request import urlopen from bs4 import BeautifulSoup import re html = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon") bsObj = BeautifulSoup(html,"lxml") for link in bsObj.find("div", {"id":"bodyContent"}).findAll("a", {"href":re.compile("^(/wiki/)((?!:).)*$")}): print(link.attrs["href"])
看了两天书,觉得应该可以爬各种网站了,结果使用urlopen经常出现 bad getway,也就是用了反爬虫手法,信心很受打击。
后面的内容应该会包含如何加代理和消息头来欺骗服务器。
继续努力!不急不躁!