【问题标题】:Missing HTML content when using selenium to scrape webpage使用 selenium 抓取网页时缺少 HTML 内容
【发布时间】:2021-03-07 06:00:38
【问题描述】:

我正在尝试从网站上获取降价的产品。

检查网站时的 HTML 如下所示:

我的代码如下所示:

browser = webdriver.Chrome(executable_path='/chromedriver.exe') 
browser.get('https://www.mydays.de/magicbox/kurzurlaub')
soup = BeautifulSoup(browser.page_source, 'html.parser')
Price = soup.find('div',{"class":"c-mbvoucher__pricebox"})

但我的结果是这样的:

<div class="c-mbvoucher__pricebox">
<span class="c-mbvoucher__price">159 €</span>
<span class="c-mbvoucher__person">
            für 2 Personen        </span>
</div>

为什么我的结果中缺少某些信息?

我也试过find_all,但上面是唯一一个匹配的。

【问题讨论】:

    标签: html selenium-webdriver xpath css-selectors webdriverwait


    【解决方案1】:

    要提取文本159 €,您可以使用以下任一Locator Strategies

    • 使用css_selector

      print(driver.find_element_by_css_selector("div.c-mbvoucher__pricebox>span.c-mbvoucher__price"))
      
    • 使用xpath

      print(driver.find_element_by_xpath("//div[@class='c-mbvoucher__pricebox']/span[@class='c-mbvoucher__price']"))
      

    理想情况下,要定位您需要为WebDriverWait 诱导visibility_of_element_located() 的元素,您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.c-mbvoucher__pricebox>span.c-mbvoucher__price"))).get_attribute("innerHTML"))
      
    • 使用XPATH

      print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='c-mbvoucher__pricebox']/span[@class='c-mbvoucher__price']"))).text)
      
    • 控制台输出:

      159 €
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

    更新

    如果您的用例是提取文本 119,25 €,因为文本位于 文本节点 中,您可以使用以下解决方案:

    • 使用CSS_SELECTOR:

      print(driver.execute_script('return arguments[0].firstChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.c-mbvoucher__pricebox")))).strip())
      
    • 使用XPATH

      print(driver.execute_script('return arguments[0].firstChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='c-mbvoucher__pricebox']")))).strip())
      
    • 控制台输出:

      119,25 €
      

    【讨论】:

    • 非常感谢您的回复!我的问题可能表述错误,我正在尝试提取报价(见截图 - 119,25 欧元)。这个价格不会出现在我的结果中——只有 159 欧元——这是原始价格。
    • @LukasZimmermann 查看答案更新并告诉我状态。
    猜你喜欢
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2021-11-21
    • 2018-05-31
    相关资源
    最近更新 更多