如何在python中使用seleniumwebdriver滚动动态网页的特定部分?

2024-05-23 20:22:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经找到了许多参考,滚动整个网页,但我寻找一个特定的部分滚动。我正在研究市场观察网-部分-最新新闻选项卡。如何使用SeleniumWebDriver滚动最新的新闻选项卡?你知道吗

下面是我的代码,它返回新闻标题,但不断重复相同的标题。你知道吗

from bs4 import BeautifulSoup
import urllib
import csv
import time
from selenium import webdriver


count = 0   
browser = webdriver.Chrome()
browser.get("https://www.marketwatch.com/newsviewer")

pageSource = browser.page_source

soup = BeautifulSoup(pageSource, 'lxml')

arkodiv = soup.find("ol", class_="viewport")

while browser.find_element_by_tag_name('ol'):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(0.5)
    div = list(arkodiv.find_all('div', class_= "nv-details"))

    heading = []
    Data_11 = list(soup.find_all("div", class_ = "nv-text-cont"))          

    datetime = list(arkodiv.find_all("li", timestamp = True))
    for sa in datetime:
        sh = sa.find("div", class_ = "nv-text-cont")
        if sh.find("a", class_ = True):
            di = sh.text.strip()
            di = di.encode('ascii', 'ignore').decode('ascii')
        else:
            continue
        print di
        heading.append((di))       
        count = count+1         


    if 'End of Results' in arkodiv:
        print 'end'
        break
    else:
        continue
    print count

Tags: textimportdivbrowsercountshallfind
1条回答
网友
1楼 · 发布于 2024-05-23 20:22:45

这是因为您正在执行的脚本会滚动到页面底部。你知道吗

要在获取新闻的元素中保持滚动,需要替换以下内容:

browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

有了这个:

browser.execute_script("document.documentElement.getElementsByClassName('viewport')[0].scrollTop = 999999")

编辑

这是完整的工作解决方案:

from bs4 import BeautifulSoup
import urllib
import csv
import time
from selenium import webdriver


count = 0   
browser = webdriver.Chrome()
browser.get("https://www.marketwatch.com/newsviewer")

while browser.find_element_by_tag_name('ol'):

    pageSource = browser.page_source
    soup = BeautifulSoup(pageSource, 'lxml')
    arkodiv = soup.find("ol", class_="viewport")
    browser.execute_script("document.documentElement.getElementsByClassName('viewport')[0].scrollTop = 999999")
    time.sleep(0.5)
    div = list(arkodiv.find_all('div', class_= "nv-details"))

    heading = set()
    Data_11 = list(soup.find_all("div", class_ = "nv-text-cont"))          

    datetime = list(arkodiv.find_all("li", timestamp = True))
    for sa in datetime:
        sh = sa.find("div", class_ = "nv-text-cont")
        if sh.find("a", class_ = True):
            di = sh.text.strip()
            di = di.encode('ascii', 'ignore').decode('ascii')
        else:
            continue
        print di
        heading.add((di))       
        count = count+1         


    if 'End of Results' in arkodiv:
        print 'end'
        break
    else:
        continue
    print count

编辑2

您可能还需要更改头的存储方式,因为您当前的方式会在列表中保留重复项。将其更改为set,这样就不会发生这种情况。你知道吗

相关问题 更多 >