硒:抓取其他元素下方的元素的内部 HTML



我试图只抓取页面上的某些 li 标签,这些标签需要不断滚动以加载新的 li 标签。HTML 看起来像这样:

<div>
<ul>
<li> INFO_1 </li>
<li> INFO_2</li>
<li> INFO_3 </li>
<li> INFO_4 </li>
<li> INFO_5 </li>
<li> INFO_6 </li>
<li> INFO_7 </li>
<li> INFO_8 </li>
<li> INFO_9 </li>
<li> INFO_10 </li>
<ul>
</div>

向下滚动后,加载了 10 个新的 li 标签:INFO_11 到 INFO_20。然后又是INFO_21 INFO_30。等等。

我只想在加载时抓取这 10 个 li 标签。冲洗并重复我需要加载的次数。我的第一直觉是把它传递给美丽汤,然后find_all('li'(,每 10 数一次,然后继续。硒内部有更简单/更优雅的方式吗?

编辑: 这就是我用来滚动的内容。我滚动的元素是一个div 弹出窗口。所以我绕过它的方式是找到第 10 个<li>标签并滚动到它。

for i in range(10, 100, 10):
#xpath of the last <li> tag
xpath = '/html/body/div[16]/div/div[1]/div/div[2]/div/div[1]/ul/li[%s]' %(str(i))
#Finding the element for Selenium
last_li_tag = driver.find_element_by_xpath(xpath)
#Scrolling to the element
driver.execute_script("arguments[0].scrollIntoView(true);", last_li_tag)
#waiting for pop up to load the next 10 tags
time.sleep(2)

如果你在运行时加载加法<li>元素,你已经把它们作为javascript对象了。您无需将它们附加到文档中并选择它们。

对于最初的 10 个元素,您可以执行以下操作:

<div>
<ul class="u_list">
<li> INFO_1 </li>
<li> INFO_2</li>
<li> INFO_3 </li>
<li> INFO_4 </li>
<li> INFO_5 </li>
<li> INFO_6 </li>
<li> INFO_7 </li>
<li> INFO_8 </li>
<li> INFO_9 </li>
<li> INFO_10 </li>
<ul>
</div>

JAVASCRIPT:

var items = document.querySelectorAll ("u_list li");

这将选择<ul>中存在的所有<li>

要获取 #11 到 #20 的文本,请执行以下操作:

texts = driver.execute_script("""
return [...document.querySelectorAll('div li')].slice(10,20).map(li => li.innerText)
""")

最新更新