网络抓取时如何绕过动态元素?

How to get around dynamic elements when web-scraping?

下面的代码有效,因为我可以使用 Python/Selenium/Firefox 在网页上单击按钮。

button on the webpage

driver.execute_script('''return document.querySelector('dba-app').shadowRoot.getElementById('configRenderer').shadowRoot.querySelector('ing-default-layout-14579').querySelector('dba-overview').shadowRoot.querySelector('ing-feat-agreement-overview').shadowRoot.querySelector('ing-ow-overflow-menu-14587').shadowRoot.querySelector('button')''').click()

但是,某些元素是动态的,只要您重新运行脚本,数字就会发生变化。

不断变化的元素:

我必须怎么做才能避开动态元素?

一种选择是寻找在页面加载过程中保持不变的其他属性。例如,给定你的 HTML,你可以这样做:

document.querySelector('#configRenderer') // returns the config renderer element
document.querySelector('[data-tag-name="ing-default-layout"]') // returns the ing-default-layout element
document.querySelector('[data-tag-name="dba-overview]') // returns the dba-overview element

等等。或者您可以使用相同的方法来识别父项或子项,然后分别导航到子项或父项。

如果 HTML 甚至还不够稳定,另一种方法是搜索 所有 元素,并找到其 [= =12=] 从你需要的开始。

for (const elm of document.querySelectorAll('*')) {
  if (elm.tagName.toLowerCase().startsWith('ing-ow-overflow-menu')) {
    // do stuff with elm, which is the overflow menu element
  }
}