Что касается ожидаемого результата, почему бы вам не извлечь текст из всех элементов span, поскольку они уже в порядке? Например, с L XML:
data=tree.xpath("//span/text()")
print(*data, sep="\n")
Вывод:
2 August 2020
1
2
3
4
15 August 2020
5
6
Если вы действительно хотите использовать циклы и создать словарь, вот предложение. Сначала данные:
data = """<div class="MainClass">
<div class="InfoClass">
<div class="left-wrap">
<span class="date">2 August 2020</span>
</div>
</div>
<div class="DataClass">
<em class="Code">
<span>1</span>
</em>
</div>
<div class="DataClass">
<em class="Code">
<span>2</span>
</em>
</div>
<div class="DataClass">
<em class="Code">
<span>3</span>
</em>
</div>
<div class="DataClass">
<em class="Code">
<span>4</span>
</em>
</div>
<div class="InfoClass">
<div class="left-wrap">
<span class="date">15 August 2020</span>
</div>
</div>
<div class="DataClass">
<em class="Code">
<span>5</span>
</em>
</div>
<div class="DataClass">
<em class="Code">
<span>6</span>
</em>
</div>
</div>"""
Затем код:
import lxml.html
tree = lxml.html.fromstring(data)
dates = [el.text for el in tree.xpath("//span[@class='date']")]
print(dates)
dc=[]
for els in dates:
lists=[el.text for el in tree.xpath("//div[span[text()='"+els+"']]/../following-sibling::div[@class='DataClass']//span[preceding::span[@class='date'][1][.='"+els+"']]")]
dc.append(lists)
print(dc)
dictionary = dict(zip(dates,dc))
print(dictionary)
Комментарии:
Сначала вы извлекаете даты в список. Затем все полагаются на следующий XPath (тот, который вы искали?), Чтобы получить соответствующие классы данных:
//div[span[text()='"+els+"']]/../following-sibling::div[@class='DataClass']//span[preceding::span[@class='date'][1][.='"+els+"']]
+els+
- даты, полученные ранее.
Наконец, вы создаете словарь. Этот код написан для LXML
. Просто замените tree.xpath
на Selenium equialent (driver.find_elements_by_xpath
), чтобы он заработал.
Вывод (даты, классы данных, словарь):
['2 August 2020', '15 August 2020']
[['1', '2', '3', '4'], ['5', '6']]
{'2 August 2020': ['1', '2', '3', '4'], '15 August 2020': ['5', '6']}
РЕДАКТИРОВАТЬ: Если вам нужно распечатайте словарь, вы можете использовать:
for keys,values in dictionary.items():
print(keys)
print(*values,sep='\n')
Вывод по запросу:
2 August 2020
1
2
3
4
15 August 2020
5
6