【问题标题】:Scraping hidden elements in a dynamically changing html在动态变化的 html 中抓取隐藏元素
【发布时间】:2021-06-01 05:45:05
【问题描述】:

我需要从动态变化的 html 中抓取一些信息。有问题的网站是: https://www.mitartlending.com/featuredartworks。在这里,当您单击给定图像并将鼠标悬停在放大的图像上时,会弹出一个文本叠加层。我正在尝试抓取该文本。在尝试使用 BS 执行此操作后,我决定可能不得不使用硒。你将如何解决这个问题?到目前为止,我有:

from selenium import webdriver
driver = webdriver.Chrome('/Users/Abramo/SeleniumDrivers/chromedriver') 
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver.get('https://www.mitartlending.com/featuredartworks')

driver.implicitly_wait(3)

my_element = driver.find_element_by_xpath(f'/html/body/div[5]/div[2]/div/main/section/div/div/div/div[3]/div/div/div/div[1]/div/a/img')
my_element.click()                                        
   

copy_from = driver.find_element_by_class_name('sqs-lightbox-meta overlay-description-visible')
my_next_button = driver.find_element_by_class_name('sqs-lightbox-next')

【问题讨论】:

    标签: python selenium beautifulsoup


    【解决方案1】:

    数据都在属性中。你只需要提取适当的。不需要 selenium 的开销。

    import requests
    from bs4 import BeautifulSoup as bs
    
    r = requests.get('https://www.mitartlending.com/featuredartworks')
    soup = bs(r.content, 'lxml')
    results = {i['data-title']:' '.join(bs(i['data-description'], 'lxml').text.split('\n')) for i in soup.select('.margin-wrapper > a')}
    print(results)
    

    【讨论】:

    • 我能问一下“.margin-wrapper > a”中的“a”是什么意思吗?
    • 这是一个 css 选择器语法。类名 margin-wrapper 的元素紧跟标签名 a 的元素
    • ^^ 除了a 是类margin-wrapper 的元素的直接子元素
    【解决方案2】:

    您可以通过

    找到这些图像中的任何一个
    images = driver.find_elements_by_xpath('//img[contains(@class,'thumb-image loaded')]')
    

    所以,例如点击第二张图片就可以了

    images[1].click()
    

    要将鼠标悬停在元素上,您可以这样做:

    from selenium.webdriver.common.action_chains import ActionChains
    
    hover = ActionChains(driver).move_to_element(images[1])
    hover.perform()
    

    现在,当文本出现时,您可以找到并获取它

    text = driver.find_elements_by_xpath('(//img[contains(@class,'thumb-image loaded')])[2]/..//p').text
    

    对于那里的任何其他图像都可以这样做。
    总而言之,代码如下所示:

    from selenium.webdriver.common.action_chains import ActionChains
    
    images = driver.find_elements_by_xpath('//img[contains(@class,"thumb-image loaded")]')
    images[1].click()
    
    time.sleep(2)
    hover = ActionChains(driver).move_to_element(images[1])
    hover.perform()
    
    time.sleep(2)
    text = driver.find_elements_by_xpath('(//img[contains(@class,"thumb-image loaded")])[2]/..//p')
    for t in text:
        print(t.text)
    

    我添加了 sleep 只是为了让它变得简单,而最好使用预期的条件等待来代替

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2010-09-15
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2011-12-04
      相关资源
      最近更新 更多