专栏首页keinYePython 爬虫第二篇(urllib+BeautifulSoup)

Python 爬虫第二篇(urllib+BeautifulSoup)

在前面一篇「Python 爬虫第一篇(urllib+regex)」 我们使用正则表达式来实现了网页输入的提取,但是网页内容的提取使用正则是比较麻烦的,今天介绍一种更简便的方法,那就是使用 BeautifulSoup 网页解析库来实现同样的功能。BeautifulSoup 的安装和用法可以参考「Python 爬虫之网页解析库 BeautifulSoup」这篇文章。

在上一篇中我们获取并解析了立创商城上的原件采购数量对应的价格,我们将整个解析过程分成了三个部分。第一步,解析出所有的采购数量所对应的价格;第二步,解析出一行中采购的数量;第三步,解析出一行中数量对应的价格信息。今天将使用正则表达式实现的解析代码更换成 BeautifulSoup。

1 解析出所有的数量对应的价格组

使用正则表达式的实现如下:

res_tr = r'<tr class="sample_list_tr">(.*?)</tr>'
m_tr = re.findall(res_tr, html_text, re.S)

更换为 BeautifulSoup 后实现如下:

soup.find_all('tr', class_='sample_list_tr')

2 解析出一行中的采购数量

使用正则表达式的实现如下:

res = r'<td width="40%" align="right">(.*?)</td>'
    find_str = re.findall(res, str, re.S)[0]
    # 去除单位
    res_2 = '[1-9]{1}[\\d ~\\s]*\\d'
    find_str = re.findall(res_2, find_str, re.S)[0]
    # 去除字符串中的空格
    strinfo = re.compile('[\\s]')
    return re.sub(strinfo, '', find_str)

更换为 BeautifulSoup 后实现如下:

number_tag = tag.find('td', align='right')
    if number_tag is None:
        return 'None'
    else:
        price = re.search('[1-9]{1}[\\d ~\\s]*\\d',
                            next(number_tag.stripped_strings),
                            re.S).group()
        strinfo = re.compile('[\\s]')
        return re.sub(strinfo, '', price)

3 解析出一行中的价格信息

使用正则表达式的实现如下:

res = r"<p class='goldenrod'>(.*?)</p>"
    find_str = re.findall(res, str, re.S)
    # 若无对应的价格是显示 None
    if len(find_str):
        # 去除价格中的单位
        res_2 = '[1-9]{1}[\\d\\.]*'
        find_str = re.findall(res_2, find_str[0], re.S)
        return find_str[0]
    else:
        return 'None'

更换为 BeautifulSoup 后实现如下:

price_tag = tag.find('p', class_='goldenrod')
    if price_tag is None:
        return 'None'
    else:
        price = [price for price in price_tag.stripped_strings]
        return re.search('[1-9]{1}[\\d\\.]*', price[0], re.S).group()

从以上三个步骤中的实现来看,使用 BeautifulSoup 的代码意图更加清晰,同时我们也无需去费心编写正则表达式『其实吧,我觉得正则表达式写起来还是比较费神的』,只需要找到所需内容所在的 html 标签,设置好过滤内容就可以了,而这些在网页源码中可以非常方便的获取到,以下既是要解析的内容所对应的源码,看完以后你就会觉得这非常简单。

源码已经上传到了最大的同性交友网站「github」,https://github.com/keinYe/pycrawler 有兴趣的话可自行查看。

本文分享自微信公众号 - keinYe(keinYe_zh)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 爬虫第一篇(urllib+regex)

    爬虫的主要用途即从网站上获取网页,并将网页中的有用信息解析出来。从网站上获取网页内容可以通过 python 内置的 urllib 模块来实现,至于信息的解析说起...

    keinYe
  • 为 Flask 应用添加用户登录

    Flask 是什么?我想打开这篇文章的你应该不陌生,但是我还引用维基百科上的内容做个简短的介绍。

    keinYe
  • Python 库 xlwings 操作 Excel 文档

    每个扩展库的功能都有其侧重点,根据所需要的功能,选择所需的扩展库即可。这里主要介绍通过 xlwings 对 Excel 文件进行操作。

    keinYe
  • KVM学习及应用的七个阶段

    KVM虚拟化的学习,也可以分为七个阶段,经过七个阶段的学习,就在生产环境中完成虚拟化任务。

    力哥聊运维与云计算
  • 触屏touchstart 与 click

    设计效果:当手指点击或触摸红框线menuList之外的部分时,弹框menuList消失。 问题:在优化触屏版的时候发现如图问题,当menuList弹出,手指触摸...

    smy
  • [译]现代框架存在的根本原因

    我曾见过许多人盲目地使用像 React, Angular 或 Vue 这样的现代框架。这些框架提供了许多有趣的东西,但通常人们会忽略它们存在的根本原因。

    小生方勤
  • Oracle生成某一用户下所有表数据的insert语句

    功能:生成某一用户下所有数据表数据的insert语句,放入d:\insert.sql文件。

    用户1148526
  • angular中,防止按钮的两次点击 原

           在我的项目中,用户点击按钮后,如果网页响应慢一点,用户常会再次点击一下。结果就触发了两次 click 操作。 如果是查询还好,但如果是post,p...

    申君健
  • 《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(二)

    虽然FCL得大多数类型都是引用类型,但程序员使用最多的还是值类型,如果一个程序全部使用的是引用类型,那么它的性能会极度低下。

    Isaac Zhang
  • 有python基础,学大数据还需不需要学java?

    Q:学校里的大佬学长说他们搞大数据基本是python,java很少,但一个培训机构的老师说大数据的许多框架都是java写的,本人有python的基础,想学大数据...

    小莹莹

扫码关注云+社区

领取腾讯云代金券