如何通过单击浏览器中的“检查元素”来获取由JavaScript生成的html?

release_the_gil

我正在尝试从此网页(日历下方的框)中获取可用时隙的小时数:

https://magicescape.it/le-stanze/lo-studio-di-harry-houdini/

我已经阅读了其他相关问题并编写了此代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup

url = 'https://magicescape.it/le-stanze/lo-studio-di-harry-houdini/'
wait_time = 10
options = Options()
options.headless = True

driver = webdriver.Firefox(options=options)
driver.get(url)
driver.switch_to.frame(0)

wait = WebDriverWait(driver, wait_time)
first_result = wait.until(presence_of_element_located((By.ID, "sb_main")))

soup = BeautifulSoup(driver.page_source, 'html.parser')
print(soup)

driver.quit()

切换到包含时隙的iframe之后,我可以通过打印得到 soup

<script id="time_slots_view" type="text/html"><div class="slots-view{{#ifCond (getThemeOption 'timeline_modern_display') '==' 'as_table'}} as-table{{/ifCond}}">
    <div class="timeline-wrapper">
        <div class="tab-pd">
            <div class="container-caption">
                {{_t 'available_services_on_this_day'}}
            </div>

            {{#if error_message}}
                <div class="alert alert-danger alert-dismissible" role="alert">
                    {{error_message}}
                </div>
            {{/if}}

            {{>emptyTimePart is_empty=is_empty is_loaded=is_loaded}}

            <div id="sb_time_slots_container"></div>
            {{> bookingTimeLegendPart legend="only_available" time_diff=0}}
        </div>
    </div>
</div></script>
<script id="time_slot_view" type="text/html"><div class="slot">
    <a class="sb-cell free {{#ifPluginActive 'slots_count'}}{{#if available_slots}}has-available-slot{{/if}}{{/ifPluginActive}}" href="#{{bookingStepUrl time=time date=date}}">
        {{formatDateTime datetime 'time' time_diff}}

        {{#ifCond (getThemeOption 'timeline_show_end_time') '==' 1}}
            -<span class="end-time">
                &nbsp;{{formatDateTime end_datetime 'time' time_diff}}
            </span>
        {{/ifCond}}

        {{#ifPluginActive 'slots_count'}}
            {{#if available_slots}}
                <span class="slot--available-slot">
                    {{available_slots}}
                    {{#ifConfigParam 'slots_count_show_total' '==' true}} / {{total_slots}} {{/ifConfigParam}}
                </span>
            {{/if}}
        {{/ifPluginActive}}
    </a>
</div></script>

而从右键单击>检查网页中的元素,我得到了

<div class="slots-view">
  <div class="timeline-wrapper">
    <div class="tab-pd">
      <div class="container-caption">
        Orari d'inizio disponibili
      </div>
      <div id="sb_time_slots_container">
        <div class="slot">
          <a class="sb-cell free " href="#book/location/4/service/6/count/1/provider/6/date/2020-03-09/time/23:00:00/">
            23:00
          </a>
        </div>
      </div>
      <div class="time-legend">
        <div class="available">
          <div class="circle">
          </div>
          - Disponibile
        </div>
      </div>
    </div>
  </div>
</div>

如何使用硒获取可用插槽的小时数(在此示例中为23:00)?

罗克克斯

要获得所需的响应,您需要:

  1. 正确识别iframe要切换到的位置(并切换到该位置)。您试图切换到frame[0]但需要frame[1]以下代码消除了对索引的依赖,xpath而是使用了
  2. 获取包含时间的元素。再次使用xpath来标识div元素的所有子元素id=sb_time_slots_container
  3. 然后迭代对这些孩子,我们div的和得到的文本属性,嵌套内的<a>这些中div的。

对于步骤1和2,您还应该使用wait.until以便可以加载内容。

...
driver.get(url)
wait = WebDriverWait(driver, wait_time)

# Wait until the iframe exists then switch to it
iframe_element = wait.until(presence_of_element_located((By.XPATH, '//*[@id="prenota"]//iframe')))
driver.switch_to.frame(iframe_element)

# Wait until the times exist then get an array of them
wait.until(presence_of_element_located((By.XPATH, '//*[@id="sb_time_slots_container"]/div')))
all_time_elems = driver.find_elements_by_xpath('//*[@id="sb_time_slots_container"]/div')

# Iterate over each element and print the time out
for elem in all_time_elems:
    print(elem.find_element_by_tag_name("a").text)

driver.quit()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何使用Safari浏览器检查元素

来自分类Dev

获取浏览器呈现的html + javascript

来自分类Dev

在浏览器中使用javascript通过类设置html输入元素的值?

来自分类Dev

直接从Python在浏览器(由BeautifulSoup生成)中启动HTML代码

来自分类Dev

捆绑的Javascript,如何检查捆绑在浏览器中的加载正确,并检查其内容

来自分类Dev

如何在谷歌浏览器中拖动/重新放置检查元素工具?

来自分类Dev

通过Web浏览器按ID获取元素并显示在标签中

来自分类Dev

如何通过拒绝Selenium Webdriver中的弹出窗口来关闭浏览器

来自分类Dev

通过在L5中单击浏览器上的“后退”按钮来防止注销后重新登录?

来自分类Dev

Chrome扩展程序可通过单击浏览器操作来创建.html页面。

来自分类Dev

从浏览器检查器中恢复javascript中的滚动

来自分类Dev

在浏览器中通过JS检查复选框

来自分类Dev

如何将检查的浏览器元素设置为此

来自分类Dev

如何检测由Enter键触发的浏览器中的鼠标单击?

来自分类Dev

在浏览器中使用javascript通过类设置html输入元素的值?

来自分类Dev

在浏览器的“检查元素”中可见的IP地址

来自分类Dev

火狐浏览器。允许通过javascript访问iframe元素

来自分类Dev

通过单击Java脚本中的按钮来打开新的浏览器选项卡

来自分类Dev

Chrome浏览器中的“检查元素”功能是什么?

来自分类Dev

如何找到已加载到浏览器元素检查器中的本地html文件?

来自分类Dev

VB.NET Web浏览器:与检查浏览器中的元素相比,DocumentText的HTML不正确

来自分类Dev

如何通过拒绝Selenium Webdriver中的弹出窗口来关闭浏览器

来自分类Dev

如何通过单击播放按钮而非嵌入来触发YouTube视频在iOS的浏览器中播放?

来自分类Dev

通过在L5中单击浏览器上的“后退”按钮来防止注销后重新登录?

来自分类Dev

如何保护Django模板以通过Web浏览器的检查元素功能更改其值(HTML和Javascript)?

来自分类Dev

如何在javascript中获取浏览器窗口大小?

来自分类Dev

.Net如何获取Web浏览器中单击元素的ID

来自分类Dev

如何通过javascript检查浏览器的在线/离线状态?

来自分类Dev

如果我在 API 中使用 POST 方法,如何通过在 url 中传递值来检查浏览器中的 php API?

Related 相关文章

  1. 1

    如何使用Safari浏览器检查元素

  2. 2

    获取浏览器呈现的html + javascript

  3. 3

    在浏览器中使用javascript通过类设置html输入元素的值?

  4. 4

    直接从Python在浏览器(由BeautifulSoup生成)中启动HTML代码

  5. 5

    捆绑的Javascript,如何检查捆绑在浏览器中的加载正确,并检查其内容

  6. 6

    如何在谷歌浏览器中拖动/重新放置检查元素工具?

  7. 7

    通过Web浏览器按ID获取元素并显示在标签中

  8. 8

    如何通过拒绝Selenium Webdriver中的弹出窗口来关闭浏览器

  9. 9

    通过在L5中单击浏览器上的“后退”按钮来防止注销后重新登录?

  10. 10

    Chrome扩展程序可通过单击浏览器操作来创建.html页面。

  11. 11

    从浏览器检查器中恢复javascript中的滚动

  12. 12

    在浏览器中通过JS检查复选框

  13. 13

    如何将检查的浏览器元素设置为此

  14. 14

    如何检测由Enter键触发的浏览器中的鼠标单击?

  15. 15

    在浏览器中使用javascript通过类设置html输入元素的值?

  16. 16

    在浏览器的“检查元素”中可见的IP地址

  17. 17

    火狐浏览器。允许通过javascript访问iframe元素

  18. 18

    通过单击Java脚本中的按钮来打开新的浏览器选项卡

  19. 19

    Chrome浏览器中的“检查元素”功能是什么?

  20. 20

    如何找到已加载到浏览器元素检查器中的本地html文件?

  21. 21

    VB.NET Web浏览器:与检查浏览器中的元素相比,DocumentText的HTML不正确

  22. 22

    如何通过拒绝Selenium Webdriver中的弹出窗口来关闭浏览器

  23. 23

    如何通过单击播放按钮而非嵌入来触发YouTube视频在iOS的浏览器中播放?

  24. 24

    通过在L5中单击浏览器上的“后退”按钮来防止注销后重新登录?

  25. 25

    如何保护Django模板以通过Web浏览器的检查元素功能更改其值(HTML和Javascript)?

  26. 26

    如何在javascript中获取浏览器窗口大小?

  27. 27

    .Net如何获取Web浏览器中单击元素的ID

  28. 28

    如何通过javascript检查浏览器的在线/离线状态?

  29. 29

    如果我在 API 中使用 POST 方法,如何通过在 url 中传递值来检查浏览器中的 php API?

热门标签

归档