爬虫解析库之xpath、Beautifulsoup的对比使用

1 xpath

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
(1)基本介绍

/ 从根节点选取,
// 从所有匹配的节点选取
. 当前节点,
.. 当前的父节点
nodename 选取节点, 
@ 选取节点的属性
通赔符 *, 选取若干路径用 | 分割
text() 选取该节点的文本内容

//img/@src: 选取所有img 节点的src属性
//img/../text 选取img节点的父节点下的text节点
//*/@src 选取任何节点的src 属性

(2)找到属性

result = html.xpath('//a/@href')
print(result)

(3)找文本

# 如果找某一标签的文本,而这个变迁下面还有其他的标签
# 那么只找这个标签的文本,子标签的文本不找。
result = html.xpath('//div/text()')
print(result)

# //text()  找到本标签以及所有子标签的文本
result = html.xpath('//div//text()')
for name in result:
    print(name)

string 也是一种函数方法,可以提取子标签的文本
 content = code.xpath('//div[@class="p_content  "]/cc/div')
    for i in content:
        print(i.xpath('string(.)'))

(4)根据指定的标签寻找

result = html.xpath('//ul/li/a[@id="jd"]/text()')
print(result[0])

快速获得xpath的方法(需要修改一些细节)

这里写图片描述

二 BeautifulSoup

eautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据
(1) 获取属性值

bs = BeautifulSoup('index.html', 'lxml')
print(bs.a['href'])

(2) 获得文本

# string 获取的文本指的是本标签的文本
# 不包含子标签的文本
print(bs.div.string)

这种办法可以获得子标签的文本
content = soup.select('div.p_content cc div')
for i in content:
    print(i.get_text())

(3) find 与 find_all
Html中的class 和id 不一样,id 必须是唯一的, 一个标签只能有一个ID
class 不是唯一的,不同的标签可以拥有同一个class,同一个标签也可以拥有多个class

# id 是唯一的,通过id 只能找一个,所以用find
print(bs.find(id="jd"))

# class 不是唯一的,通过class 来找 可能找到多个
# 注意class_ 这里有一个下划线
print(bs.find_all(class_="shopping"))

# find_all 是列表 ,find 是字符串

(4) select 的用法

# select--选择指定的标签
print(bs.select('title'))

# 当选择的对象有多个的时候,就获取多个的对象
print(bs.select('a'))

# . 表示类名  # 表示id
print(bs.select('.first'))
print(bs.select('#jd'))
表示根据层级关系寻找
soup.select('li.d_name a')

例子1:

通过提取百度贴吧的(发帖人)与(发帖内容) 来比较re,xpath,BeautifulSoup 的用法 这里只是对比提取不同,所以只对一页的内容进行比较


import re
from bs4 import BeautifulSoup
from lxml import etree
import requests


class SpiderCompare(object):
    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
                          ' (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}

    def get_code(self):
        response = requests.get('https://tieba.baidu.com/p/5743456239?pn=1', headers=self.headers).text
        return response

    def use_re(self, code):
        pattern = re.compile(r'<li class="d_name".*?<a.*?>(.*?)</a>'
                             r'.*?<cc.*?class="d_post_content j_d_post_content ">(.*?)</div>', re.S)
        result = re.findall(pattern, code)
        pattern = re.compile(r'<.*?>|<br>|</a>', re.S)
        for name, content in result:
            new_name = re.sub(pattern, '', name)
            new_name = pattern.sub('', name)
            # 两种写法
            new_content = re.sub(pattern, '', content)
            print(new_content)

    def use_xpath(self, code):
        new_code = etree.HTML(code)
        name = new_code.xpath('//li[@class="d_name"]/a/text()')
        for new in name:
            print(new.replace(' ', '').strip('\n'))
        content = new_code.xpath('//cc/div[@class="d_post_content j_d_post_content "]//text()')
        for new in content:
            print(new)

    def use_soup(self, code):
        soup = BeautifulSoup(code, 'lxml')
        name = soup.select('li.d_name a')
        for new in name:
            print(new.get_text())

        content = soup.select('cc div')
        for new in content:
            print(new.get_text())


    def manager_spider(self):
        code = self.get_code()
        self.use_re(code)
        self.use_xpath(code)
        self.use_soup(code)


spider = SpiderCompare()
spider.manager_spider()

通过以上同时使用三种方法,打印content的内容,发现使用re和soup 会把一个标签里的文本输出在一行, 而 xpath 会以文本在浏览器中的显示方式 进行输出。

例子2:

通过提取天堂图片网,图片的src 和title属性,来比较soup和xpath的具体用法


from bs4 import BeautifulSoup
from lxml import etree
import requests

# 这是网页源码提取的部分
'''
<li>
<div class="il_img"><a href="/tupian/makelong_v47314/" title="美味的马卡龙图片" target="_blank">
<img src="http://img.ivsky.com/img/tupian/li/201803/13/macaroon-001.jpg" alt="美味的马卡龙图片"></a></div>
<p><a href="/tupian/makelong_v47314/" target="_blank">美味的马卡龙图片(12张)</a></p>
</li>

'''


class TianTangSpider(object):
    def get_code(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
                          ' (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
        }
        response = requests.get('http://www.ivsky.com/tupian/meishishijie/', headers=headers).text
        return response

    def use_xpath(self, code):
        code = etree.HTML(code)
        # 因为a标签下面嵌套着img标签,这里只获取a标签的href 属性
        href = code.xpath('//div[@class="il_img"]/a')
        for i in href:
            print(i.get('href'))

        image_list = code.xpath('//div[@class="il_img"]/a/img')
        for name in image_list:
            src = name.get('src')
            alt = name.get('alt')

    def use_soup(self, code):
        soup = BeautifulSoup(code, 'lxml')
        image_list = soup.select('div.il_img img')
        for name in image_list:
            src = name.get('src')
            alt = name.get('alt')

    def func_manager(self):
        code = self.get_code()
        self.use_xpath(code)
        self.use_soup(code)


tian = TianTangSpider()
tian.func_manager()

总结:两种使用方法基本上没有区别,只有在调用各自方法的时候,书写有一些区别

xpath:

code = etree.HTML(code)
src_list = code.xpath('//div[@class=]/a/div')
# 注意//必须写,表示在根目录开始找,也可以在某个嵌套循环里不写,

soup

soup = BeautifulSoup(code, 'lxml')
src_list = soup.select('div.类名 img ')
# 标签与属性是通过.连接的 到下一级标签使用 空格 连接的。
  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求实现,如Python中的Requests解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据、NoSQL数据、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值