网络抓取时如何绕过动态元素?
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()
但是,某些元素是动态的,只要您重新运行脚本,数字就会发生变化。
不断变化的元素:
- 'ing-default-layout-14579'
- 'ing-ow-overflow-menu-14587'
我必须怎么做才能避开动态元素?
一种选择是寻找在页面加载过程中保持不变的其他属性。例如,给定你的 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
}
}
下面的代码有效,因为我可以使用 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()
但是,某些元素是动态的,只要您重新运行脚本,数字就会发生变化。
不断变化的元素:
- 'ing-default-layout-14579'
- 'ing-ow-overflow-menu-14587'
我必须怎么做才能避开动态元素?
一种选择是寻找在页面加载过程中保持不变的其他属性。例如,给定你的 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
}
}