网页 抓取 innertext 试题(一个soup对象用beautifulsoup库中方法提取页面源码(图) )

优采云 发布时间: 2022-01-16 17:18

  网页 抓取 innertext 试题(一个soup对象用beautifulsoup库中方法提取页面源码(图)

)

  假设有一个页面有n个选择题,每个选择题都有几个选项。茎部分标有 h6 标签。options 部分使用 td 下的 div 标签。如下所示:

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

  

第1题.  选一二三还是四五六呢。

 

A.一二三

 

B.四五六

  接下来,我想使用beautifulsoup库中的方法来提取页面上的主题和选项。

  首先,导入所需的包:

  from bs4 import BeautifulSoup

from urllib import request,parse

import re

  然后可以通过多种方式提取页面源代码:

  #既可以打开一个html文件:

soup = BeautifulSoup(open("page_source_code.html"))

#或者直接传入HTML代码:

soup = BeautifulSoup("data")

#也可以发送并且拦截请求:

url = “http://fake.html”

response = request.urlopen(url,timeout = 20)

responseUTF8 = response.read().decode("utf-8")

soup = BeautifulSoup(responseUTF8,'lxml')

  简而言之,这样我们就得到了一个汤对象。接下来根据对象的标签结构,通过一定的方法定位目标标签。

  方法一:下面的方法比较基础,使用“绝对路径”查找标签

  # 通过观察发现,题干部分全部都是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)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线