用Beautiful Soup进行屏幕抓取

这篇博客介绍了如何利用Python的Beautiful Soup库进行屏幕抓取。内容包括数据抓取的基本步骤、具体操作方法,详细讲解了Beautiful Soup的使用,如提取隐藏字段,以及提供了多个实践练习,如获取运营商列表、处理XML文件中的数据。还提醒了在处理HTML和XML文档时需要注意的格式问题和解析器的选择。
摘要由CSDN通过智能技术生成

数据抓取操作步骤

  1. 创建用于发送HTTP请求时将用到的所有值
  2. 发出HTTP请求并下载所有数据
  3. 解析这些数据文件中需要的数据,

具体操作步骤

首先需要弄清需要访问哪个URL以及需要哪种HTTP方法。HTTP方法类似于:

method="post"

URL类似于:

action="Data_Elements.aspx?Data=2"

Beautiful Soup

Beautiful Soup是一个Python库,用于从HTML和XML文件中提取数据。它使用您喜欢的解析器来提供导航、搜索和修改解析树的惯用方法。它通常节省程序员几个小时或几天.

下面是中文帮助文档链接https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

这是不同的beautiful soup解析器的比较

这里写图片描述

用Beautiful Soup提取隐藏字段

任务:使用 BeautifulSoup 处理 HTML,提取出
"__EVENTVALIDATION”和“__VIEWSTATE”的隐藏表格字段值,并在数据字典中设置相应的值。

代码实现:

def extract_data(page):
# 同之前的方法一样,定义字典,方便对键赋值
    data = {
    "eventvalidation": "",
            "viewstate": ""}
    with open(page, "r") as html:
# 这里用lxml解析器,后文会做简要介绍
        soup = BeautifulSoup(html, "lxml")
        ev = soup.find(id="__EVENTVALIDATION")
# 把ev中value的值取出来给data的键
        data["eventvalidation"] = ev["value"]

        vs = soup.find(id="__VIEWSTATE")
        data["viewstate"] = vs["value"]

    return data

解析器图片

推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.

提示: 如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的

find()方法

find( name , attrs , recursive , text , **kwargs )

find_all() 方法将返回文档中符合条件的所有tag,尽管有时候我们只想得到一个结果.比如文档中只有一个标签,那么使用 find_all() 方法来查找标签就不太合适, 使用 find_all 方法并设置 limit=1 参数不如直接使用 find() 方法.下面两行代码是等价的:

soup.find_all('title', limit=1)
# [<title>The Dormouse's story</title>]

soup.find('title')
# <title>The Dormouse's story</title>

唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果.

find_all() 方法没有找到目标是返回空列表, find() 方法找不到目标时,返回 None .

print(soup.find("nosuchtag"))
# None

soup.head.title 是 tag的名字 方法的简写.这个简写的原理就是多次调用当前tag的 find() 方法:

soup.head.title
# <title>The Dormouse's story</title>

soup.find("head").find("title")
# <title>The Dormouse's story</title>

练习:获取运营商列表

任务

获取一个包含所有航空公司的列表。在你所返回的数据中要去掉所有类似 “All U.S. Carriers” 的组合。最终你应该返回一个含有运营商编码的列表。

部分被处理代码:

	    <tr>
	        <td style="width: 450px">
	            <select name="CarrierList" id="CarrierList" class="slcBox" 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Einstellung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值