网页 抓取 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)