Beautifulsoup 爬取页面试题

假设有一个页面,页面中有n道选择题,每道选择题有若干个选项。题干部分用h6 标签标记。选项部分用的是td 下的div 标签。如下图所示:

整个页面是将如下的HTML 段落循环n次。

<div style="" class="qItemType qItemDetail1" value="10000#1" id="quest2436">
    <div>
        <div class="breadcrumb">
            <div>
                <ul style="list-style-type:none;">
                    <li><h6><a name="qnum1" style="color: red;">第1题.</a>&nbsp;&nbsp;选一二三还是四五六呢。</h6></li>
                </ul>
            </div>
            <ul style="list-style-type:none">
                <li>
                    <table>
                        <tbody><tr>
                                 <td>
                                    <div>A.一二三</div>
                                 </td>
                                </tr>
                                <tr>
                                  <td>
                                     <div>B.四五六</div>
                                  </td>
                                 </tr>
                         </tbody></table>
                 </li>
            </ul>
        </div>
<div>                                

下面想要用beautifulsoup 库中的方法将页面上的题目和选项提取出来。

首先要引入需要用到的包:

from bs4 import BeautifulSoup
from urllib import request,parse
import re

然后可以用多种方法提取页面源码,:

#既可以打开一个html文件:
soup = BeautifulSoup(open("page_source_code.html"))
#或者直接传入HTML代码:
soup = BeautifulSoup("<html>data</html>")
#也可以发送并且拦截请求:url = “http://fake.html”
response = request.urlopen(url,timeout = 20)
responseUTF8 = response.read().decode("utf-8")
soup = BeautifulSoup(responseUTF8,‘lxml‘)

总之,这样我们就得到了一个soup 对象。接下来只要根据对象的标签结构,通过一定方法定位到目标标签,就可以了。

下面这种方法比较基本,用的是“绝对路径”找寻标签

# 通过观察发现,题干部分全部都是h6标签,和h6标签下的a标签。页面其余部分没有用到h6标签,所以用.find_all方法来抓取所有的题干。得到一个标签 list
h6lbs = soup.find_all(‘h6‘)
# 定义一个二维数组,用来盛放抓取到的选择题。选择题的题干和选项可作为每一个数组成员的成员。
item_question = []
for i in range(len(h6lbs)):
    #定义一个一维数组,可以用来盛放题干和选项。先把刚刚拿到的题干保存进数组中
    item = []
    item.append(h6lbs[i].text)
    #通过以上的HTML 结构可以知道,找到题干后,题干标签的“太爷爷”的“三弟弟”是保存选项的地方,所以这里用了很多个.parent 和 .next_sibling方法,通过绝对路径的方式定位标签
    tag1 = h6lbs[i].parent.parent.parent.next_sibling.next_sibling
    # check if this is choice question. or it must be a Yes/No questionnaire
    if tag1 is not None and tag1.li is not None:
        #刚刚说到太爷爷的三弟弟是存放选项的地方。太爷爷的三弟弟下的li标签下的table标签下的tbody标签下存放了多个选项,从这里开始需要遍历,将每一个选项都提取出
        tag = h6lbs[i].parent.parent.parent.next_sibling.next_sibling.li.table.tbody
        for child in tag.children:
            #因为抓取出来有空对象,所以此处加入了一个判断。如果是None,就不保存了。
            if child.string is None:
                tag_string = child.td.div.string
                #遍历每一个标签,取出其中的选项内容,用.string方法
                #将取到的选项内容加入刚刚创建的一维数组中
                item.append(tag_string)
        # print(item)
    #将每次得到的一维数组保存进二维数组中
    item_question.append(item)
print(item_question)

还可以用相对路径的方法定位标签:

#通过观察可以发现,每一个试题都是在一个div标签,并且value 为11111#1,11111#2,11111#3的标签下的。所以我们先将这个标签取到,作为一个参照。re.compile是正则表达式方法
the_tag = soup.find_all(‘div‘,value = re.compile(‘11111#\d‘))
print(len(the_tag))
#创建二维数组,用来保存试题
item_question = []
for tag in the_tag:
    #创建一维数组,用来保存题干和选项
    item = []
    #遍历刚刚选好的参照标签
    for child_tag in tag.descendants:
        #每一个参照标签下的h6标签都是题干,提取出来保存。
        if child_tag.name == "h6":
            item.append(child_tag.get_text("", strip=True))
        #每一个参照标签下的td标签都是选项,提取出来保存
        elif child_tag.name == "td":
            if child_tag.div is not None:
                item.append(child_tag.div.get_text("", strip=True))
    item_question.append(item)
print(item_question)

原文地址:https://www.cnblogs.com/testertry/p/11516536.html

时间: 2024-08-29 05:11:18

Beautifulsoup 爬取页面试题的相关文章

[实战演练]python3使用requests模块爬取页面内容

本文摘要: 1.安装pip 2.安装requests模块 3.安装beautifulsoup4 4.requests模块浅析 + 发送请求 + 传递URL参数 + 响应内容 + 获取网页编码 + 获取响应状态码 5.案例演示 后记 1.安装pip 我的个人桌面系统用的linuxmint,系统默认没有安装pip,考虑到后面安装requests模块使用pip,所以我这里第一步先安装pip. $ sudo apt install python-pip 安装成功,查看PIP版本: $ pip -V 2.

使用BeautifulSoup爬取“0daydown”网站的信息(2)——字符编码问题解决

上篇中的程序实现了抓取0daydown最新的10页信息,输出是直接输出到控制台里面.再次改进代码时我准备把它们写入到一个TXT文档中.这是问题就出来了. 最初我的代码如下: #-*- coding: utf-8 -*- #------------------------------------- #version: 0.1 #note:实现了查找0daydown最新发布的10页资源. #------------------------------------- #----------------

使用BeautifulSoup爬取“0daydown”站点的信息(2)——字符编码问题解决

上篇中的程序实现了抓取0daydown最新的10页信息.输出是直接输出到控制台里面.再次改进代码时我准备把它们写入到一个TXT文档中.这是问题就出来了. 最初我的代码例如以下: #-*- coding: utf-8 -*- #------------------------------------- #version: 0.1 #note:实现了查找0daydown最新公布的10页资源. #------------------------------------- #--------------

爬虫实例——爬取淘女郎相册(通过selenium、PhantomJS、BeautifulSoup爬取)

环境 操作系统:CentOS 6.7 32-bit Python版本:2.6.6 第三方插件 selenium PhantomJS BeautifulSoup 代码 # -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') ''' 作者:昨夜星辰 ''' import re import os import time import shutil import requests import sub

Python 利用 BeautifulSoup 爬取网站获取新闻流

0. 引言 介绍下 Python 用 Beautiful Soup 周期性爬取 xxx 网站获取新闻流: 图 1 项目介绍 1. 开发环境 Python: 3.6.3 BeautifulSoup:   4.2.0 , 是一个可以从HTML或XML文件中提取数据的Python库* ( BeautifulSoup 的中文官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ ) 2. 代码介绍 实现主要分为三个模块: 1. 计时

python 爬虫 requests+BeautifulSoup 爬取巨潮资讯公司概况代码实例

第一次写一个算是比较完整的爬虫,自我感觉极差啊,代码low,效率差,也没有保存到本地文件或者数据库,强行使用了一波多线程导致数据顺序发生了变化... 贴在这里,引以为戒吧. # -*- coding: utf-8 -*- """ Created on Wed Jul 18 21:41:34 2018 @author: brave-man blog: http://www.cnblogs.com/zrmw/ """ import requests

爬取页面和审查元素获取的内容不一致

今天看书看到 图片爬虫实战之爬取京东手机图片 这一节,想着自己动手练习一下,因为以前看过视频所以思路还是比较清晰,主要是为了复习巩固刚刚学的正则表达式. 打开京东手机页面, https://list.jd.com/list.html?cat=9987,653,655&page=1&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main 审查元素发现手机图片有两种格式: 1.每一页的前十是这样的 2.第十一个开始是这样的 仔细看了看区别就是多了一

python利用selenium+requests+beautifulsoup爬取12306火车票信息

在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地  ,时间  之后点击确定,这是我们打开谷歌浏览器开发者模式找到   https://kyfw.12306.cn/otn/resources/js/framework/station_name.js    这里包含了所有城市的信息和所有城市的缩写字母.想要获取火车票信息  https://kyfw.12306.cn/otn/left

BeautifulSoup爬取电影天堂全站电影资源

#爬取电影天堂全站电影资源链接#功能:#1.获取电影天堂资源下载链接并输出#2.所有链接保存为一个csv文件 import timeimport requestsfrom bs4 import BeautifulSoupimport csv def spider(url): global page, No, fobj try: page += 1 print("第{}页".format(page)) # time.sleep(1) #获取网页链接并读取 html = requests.