刚学完xpath和bs4解析,先不讨论哪个性能更好(就我这5年前的CPU也很难体验出来)
xpath:
html = etree.HTML(respText)
data_list = html.xpath('//ul[@class="cook-list"]//li[@class="clearfix"]') # 找指定ul下得所有li
for data in data_list:
# 提取标签文本
title = data.xpath('./div/a/text()')[0]
# 提取标签属性
title2 = data.xpath('./a/@title')[0]
# 这里从1开始,不是0
try:
title3 = data.xpath('./div/div[1]//span[2]/text()')[0]
# 上面[0]会报错
except IndexError:
title3 = ""
# 这个数据有多个空格组
headicon = "".join(data.xpath('./div/div[2]/a/text()')) # 无分隔符join
headicon = headicon.strip() # 去空格
# 生成器函数
yield{
"标题": title,
"配料": title2,
"评分": title3,
"博主": headicon
}
bs4:
def parse_data_index(self, resp):
soup = BeautifulSoup(resp, "lxml")
data_list = soup.find_all('img', width="300px")
for data in data_list:
href = data.get("src")
self.write_data(href)
二者功能差不多,并且都要用lxml,bs4还有一个BeautifulSoup
其实从例子上已经能看出来了,如果要抓取一个标签下的多个内容,xpath可能会更加直观一点,按照目录结构往下级怎么折腾都行,个人也比较喜欢这种方式,需要注意的是这里的编号是从1而不是从0开始的;
bs4适合一步到位抓到指定位置,比如直接抓取网页的title、meta之类,往下移动没有xpath那么好用(个人习惯),但是可以支持往上走(preview_sibling),在特定的场合肯定会比xpath代码少。
总的来说,xpath比较符合目录结构,而且书写方式比较直观,不出意外未来肯定是以xpath为主的