【问题标题】:Hidden HTML elements using Mechanize Python使用 Mechanize Python 隐藏 HTML 元素
【发布时间】:2015-03-07 16:46:29
【问题描述】:

所以我正在编写一个 Python 脚本来检查 Blackboard(学校界面站点)是否有更新。但是我从脚本中收到的 HTML 与在浏览器中查看时的 HTML 并不完全相同。我不确定这是 cookie 问题还是我遗漏了什么。

USERNAME = ''
PASSWORD = ''

updates = 0  
site = 'http://schoolsite.edu'

browser = mechanize.Browser()
browser.open(site)
browser.select_form(nr = 0)
browser.form['j_username'] = USERNAME
browser.form['j_password'] = PASSWORD
browser.submit()

#it brings back an empty form, just submit it.
browser.select_form(nr = 0)
browser.submit()

html_resp = browser.response().read()

有问题的 HTML 如下所示(来自脚本)

<span id="badgeTotal" style="visibility: hidden" title="">
<span class="hideoff" id="badgeAXLabel">Activity Updates</span>
<span class="badge" id="badgeTotalCount" title=""></span>

我期望它的样子(来自 Chrome/实际浏览器)

<span id="badgeTotal" style="visibility: visible;" title="">
<span class="hideoff" id="badgeAXLabel">Activity Updates</span>
<span class="badge" id="badgeTotalCount" title="">1</span>

我真正想要的是最后一行中的“1”数字,但我觉得可见性属性阻碍了它。请注意,我从 Mechanize 获得的 cookie 与我在浏览器中获得的 cookie 相同。 (不完全相同,但相同的 id、名称等)

有什么想法吗?

感谢任何输入。

【问题讨论】:

    标签: python html web-scraping mechanize hidden


    【解决方案1】:

    很确定有 javascript 参与 which mechanize cannot handle.

    这里的另一种解决方案是通过selenium 自动化真实浏览器:

    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox()  # could also be headless: webdriver.PhantomJS()
    driver.get('http://schoolsite.edu')
    
    # submit a login form
    username = driver.find_element_by_name('j_username')
    password = driver.find_element_by_name('j_password')
    
    username.send_keys(USERNAME)
    password.send_keys(PASSWORD)
    
    username.submit()
    
    # wait for the badge count to appear
    badge_count = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "badgeTotalCount")))
    
    print(badge_count.text)
    

    【讨论】:

    • 哇!惊人的。谢谢@alecxe。有效!我不想处理Firefox的打开和关闭,所以我使用了这个post。很高兴您添加了有关 PhantomJS 的评论。我还必须添加一个延迟来获取徽章计数。所以最后几行看起来像:badge_count = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "badgeTotalCount")))sleep(2)print(badge_count.text)我知道这并不优雅,但它有效。
    猜你喜欢
    • 2011-12-04
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多