在HTML中的元素数组中循环使用两个独立的标记名的最佳方式是什么



我真的不知道如何正确地表达这个问题,但我基本上是在玩python,并使用Selenium来抓取一个网站,我正在尝试用数据创建一个JSON文件。

以下是我的目标:

{
"main1" : {
"sub1" : "data",
"sub2" : "data",
"sub3" : "data",
"sub4" : "data"
},
"main2" : {
"sub1" : "data",
"sub2" : "data",
"sub3" : "data",
"sub4" : "data"
}
}

我目前面临的问题是网站没有缩进或子元素。它看起来像这样(当然是更长的实际副本(:

<h3>Main1</h3>
<p>Sub1</p>
<p>Sub2</p>
<p>Sub3</p>
<p>Sub4</p>
<h3>Main2</h3>

现在,我想遍历HTML,以便使用<h3>标记作为父标记(JSON示例中的"Main"(,使用<p>标记作为子标记(sub[num](。我对python和Selenium都是新手,所以我可能做错了,但我尝试过使用items.find_elements_by_tag_name('el')将两者分离,但我不知道如何按照它们最初的顺序将它们重新组合在一起。

然后,我尝试循环遍历所有元素,并使用if (item.tag_name == "el"):循环分隔标记。当我打印每个循环的结果时,这非常有效,但当涉及到将它们放在JSON文件中时,我遇到了与以前的方法相同的问题,在以前的方法中,我似乎无法将2连接起来。我尝试了一些变体,但要么出现关键错误,要么只记录循环中的最后一项。

仅供参考,以下是此步骤的代码:

items = browser.find_element_by_xpath(
'//*[@id="main-content"]') #Main Content
itemList = items.find_elements_by_xpath(".//*")
statuses = [
"Status1",
"Status2",
"Status3",
"Status4"
]
for item in itemList: #iterate through the HTML
if (item.tag_name == "h3"): #Separate H3 Tags
main = item.text
print("======================================")
print(main)
print("======================================")
if (item.tag_name == 'p'): #Separate P tags
for status in statuses: 
if(status in item.text): #Filter P tags to only display info that contains words in the Status array
delimeters = ":", "(", "See"
regexPattern = "|".join(map(re.escape, delimeters))
zoneData = re.split(regexPattern, item.text)

#Split P tags into separate parts
sub1 = zoneData[0] 
sub2 = zoneData[1].translate({ord('*'): None})
sub3 = zoneData[2].translate({ord(")"): None})
print(sub1)
print(sub2)
print(sub3)

我决定尝试的最后一个选项是再次尝试浏览所有HTML,但使用enumerate(),使用元素的ID,并包括两个ID之间的所有标签,但我还不确定我的行动计划是什么。

总的来说,最后一个选项似乎有点复杂,我很确定有一种更简单的方法可以做到这一点。你有什么建议?

这是我的想法,但我没有做数据部分,您可以稍后添加。

我认为主名称中并没有重复,否则您将丢失一些信息。


items = browser.find_element_by_xpath(
'//*[@id="main-content"]') #Main Content
itemList = items.find_elements_by_xpath(".//p|.//h3") # only finds h3 or p
def construct(item_list):
current_main = ''
final_dict: dict = {}
for item in item_list:
if item.tag_name == "h3":
current_main = item.text
final_dict[current_main] = {} # create empty dict inside main. remove if you want to update the main dict
if item.tag_name == "p":
p_name = item.text
final_dict[current_main][p_name] = "data"
return final_dict

最新更新