CCF计算机职业资格考试 201809-3元素选择器 Python实现

CCF计算机职业资格考试

201809-3 元素选择器 Python实现

(题目可以参看搜索引擎或官网。)

写了很久,反复调试…要是考试肯定就完了…

标签和ID选择器都很简单,主要是后代选择器的实现:

后代选择器主要思路是把待查询的选择器最后一个节点的所有祖宗节点都找到,只要待查询的选择器中的对象在祖宗节点中依次出现,则该节点符合要求

例如:div div p
先用标签选择器把html中所有p位置找到,对于每一个位置的p找出其所有的祖先节点:(父亲节点,爷爷节点,……),判断div div p是否按顺序在其中出现。若是,则该节点符合要求;若否,则对下一个p进行操作……

下面是实现代码:
我的GitHub上还有一些其他题的python实现。

def Level(String):
    for i in range(len(String)):
        if String[i] != '.':
            break
    level = i // 2
    label = ''
    ID = ''
    if len(String[i:].split()) == 1:
        label = String[i:]
    else:
        label, ID = String[i:].split()
    return {'level': level,'label': label, 'id': ID}

row, test = map(int, input().split())
html = [None] # 0号位用None占位
for i in range(row):
    html.append(Level(input()))
search = []
for i in range(test):
    search.append(list(input().split()))

def LabelOrId(String):
    temp = [0]
    for i in range(1, len(html)):
        if String.lower() == html[i]['label'].lower() or String == html[i]['id']:
            temp[0] += 1
            temp.append(i)
    return temp

def ParentRow(row):
    if row == 0:
        return 0
    else:
        level = html[row]['level']
        for i in range(row, 0, -1): # html第0位为None
            if html[i]['level'] == level - 1:
                return i
        return 0 # 不存在父节点

def Descendant(List):
    row = []
    temp_answer = LabelOrId(List[-1])
    for i in range(temp_answer[0]):
        flag = []
        son_row = temp_answer[i + 1]
        family_row = [son_row]
        while True:
            parent_row = ParentRow(son_row)
            if parent_row == 0:
                break
            else:
                family_row.append(parent_row)
                son_row = parent_row
        family_row.reverse()
        j, k = 0, 0
        while k < len(family_row):
            if List[j].lower() == html[family_row[k]]['label'].lower() or List[j] == html[family_row[k]]['id']:
                flag.append(True)
                k += 1
                j += 1
                if j >= len(List): break
            else:
                k += 1
        if flag == [True] * len(List):
            row.append(temp_answer[i + 1])
    l = len(row)
    row.insert(0, l)
    return row

result = []
for i in range(test):
    if len(search[i]) == 1:
        answer = LabelOrId(search[i][0]) # 标签和ID选择器
        result.append(answer)
    else:
        answer = Descendant(search[i]) # 后代选择器
        result.append(answer)

for i in range(len(result)):
    print(' '.join(map(str, result[i])))

# 测试样例
'''
11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two
p
#subtitle
h3
div p
div div p
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值