【问题标题】:Find Elements Between Div With Selenium in Python在 Python 中查找 Div 与 Selenium 之间的元素
【发布时间】:2020-11-22 07:09:42
【问题描述】:

我有以下 HTML 代码,我想提取年份和姓名,我尝试了一切都没有成功:

<div class="Year">

<span class="date">2019</span>

</div>



<div class="cl2">
    <span class="name">name1</span>
</div>
<div class="cl2">
    <span class="name">name2</span>
</div>
<div class="cl2">
    <span class="name">name3</span>
</div>
<div class="cl2">
    <span class="name">name4</span>
</div>



<div class="Year">
    <span class="date">2020</span>
</div>

<div class="cl2">
    <span class="name">name5</span>
</div>
<div class="cl2">
    <span class="name">name6</span>
</div>

我想得到的是:

2019
name1
name2
name3
name4
2020
name5
name6

我尝试了以下,使用 xpath

years = driver.find_elements_by_xpath("//div[@class='year']")

for year in years:
    
    print(year.find_element_by_xpath(".//span[@class='date']").text)

names = driver.find_elements_by_xpath("//div[@class='name']")

for name in names:
    print(name.find_element_by_xpath(".//span[@class='name']").text)

我明白了:

2019

2020

名字1

名字2

名字3

名字4

名字5

名字6

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    您可以使用preceding 获取它们:

    names = dict()
    for e in driver.find_elements_by_class_name('name'):
        name = e.text
        year = e.find_element_by_xpath("(./preceding::span[@class='date'])[last()]").text
        names[name] = year
    

    {'name1': '2019', 'name2': '2019', 'name3': '2019', 'name4': '2019', 'name5': '2020', 'name6': '2020'}

    您还可以使用class 获取所有元素并收集:

    names = dict()
    year = None
    for e in driver.find_elements_by_css_selector('.date, .name'):
        if 'name' in e.get_attribute('class'):
            names[e.text] = year
        if 'date' in e.get_attribute('class'):
            year = e.text
    

    {'name1': '2019', 'name2': '2019', 'name3': '2019', 'name4': '2019', 'name5': '2020', 'name6': '2020'}

    【讨论】:

    【解决方案2】:

    一种解决方案是使用转换为文本文件的 html 文件,而不是直接使用 html 文件。这种方法提供了更大的灵活性,可以从给定的源文件中提取所需的文本。

    首先,导入import re 库,它可以让我们轻松解析我们的html_text 文件

    然后读入文本文件并使用.split() 将文本拆分为基于年级的列表。接下来,遍历列表并使用re.searchre.findall 在文本字符串中定位您的日期和名称类。

    import re 
    
    f = open("html_text.txt", "r")
    html_text = (f.read())
    
    text_list = text.split('<div class="Year">')
    
    for year in text_list[1:]:
      date = re.search('<span class="date">(.+?)</span>', year)
      names = re.findall('<span class="name">(.+?)</span>', year)
    
      print(date.group(1))
      for name in names:
        print(name)
    

    打印结果时的输出应该是这样的

    输出:

    2019
    name1
    name2
    name3
    name4
    2020
    name5
    name6
    

    希望这有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多