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
'''