2016-08-29 16 views
0

"Mechanize"を使っていくつかのHTMLコードを抽出しています。しかし、私は出力されたHTMLコードに問題があります。基本的には、Mechanizeは特定の要素の中のコンテンツを '(n/a)'に置き換えているようです。Python Mechanizeファイヤーバグとは異なるHTMLコードHTMLコード

例(構造はFirebugの中に示されている)

<tr> 
    <td> 
     <img class="bullet" src="images/bulletorange.gif" alt=""> 
     <span class="detailCaption">Video Format Mode:</span> 
     <span class="settingValue" id="vidSdSdiAnlgFormatSelectionMode.1.1">Auto</span> 
    </td> 
</tr> 

例(Mechanizeのにより構造出力)

<tr> 
    <td> 
     <img class='bullet' src='images/bulletorange.gif' alt='' /> 
     <span class='detailCaption'>Video Format Mode:</span> 
     <span class='settingValue' id="vidSdSdiAnlgFormatSelectionMode.1.1">(n/a)</span> 
    </td> 
</tr> 

問題は、 "自動" が "(N/A)" によって置換されていることです。なぜ私は本当にわからない!

助けてください。なぜ機械化がこれをやっているのですか?それをどうやって修正することができますか?私のコードの下

...

def login_and_return_html(self, url_login, url_after_login, form_username, form_password, username, password): 
    """ 
    Description: Returns html code form a website that requires login. 

    Input Arguments: url_login (str)-The url where you enter the login username and password 
        url_after_login (str)-The url where you want to go after you login 
        form_username (str)-The name of the form for the username input field 
        form_password (str)-The name of the form for the password input field 
        username (str)-The actual username 
        password (str)- The actual password 

    Return or Output: Returns HTML code of the 'url_after_login' page 

    Modules and Classes: mechanize 
         ssl 
    """ 
    try: # Unabling SSL certificate validation 
     _create_unverified_https_context = ssl._create_unverified_context 
    except AttributeError: # Legacy Python that doesn't verify HTTPS certificates by default 
     pass 
    else: # Handle target environment that doesn't support HTTPS verification 
     ssl._create_default_https_context = _create_unverified_https_context 

    br = mechanize.Browser() # Browser 

    br.set_handle_equiv(True) # Browser options 
    br.set_handle_redirect(True) 
    br.set_handle_referer(True) 
    br.set_handle_robots(False) 

    cj = mechanize.CookieJar() # Cookie Jar 
    br.set_cookiejar(cj) 

    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), 
          max_time=1) # Follows refresh 0 but not hangs on refresh > 0 

    br.open(url_login) # Login 
    br.select_form(nr=0) 
    try: 
     br.form[form_username] = username                   #Fill in the blank username form 
     br.form[form_password] = password                   #Fill in the blank password form 
     br.submit() 
    except: 
     control = br.form.find_control(form_username) 
     for item in control.items:                     #Dropdown menu username form 
      if item.name == username: 
       item.selected = True 
     br.form[form_password] = password                   #Fill in the blank password form 
     br.submit() 

    html = br.open(url_after_login).read() 
    return html 

答えて

1

はなぜこれをやって機械化されましたか?

おそらく機械はブラウザではありません。私の推測では、サイトは機械化でサポートされていないJavascriptを使用しているため、元の形式、つまりJavascriptが実行される前の内容のHTMLを取得します。

どのように修正できますか?

機械化されていませんが、Javascriptをサポートする解決策が必要です。詳細および可能な解決方法については、Mechanize and Javascriptを参照してください。

+0

私はそれを試して、私が思い付くものを見てみましょう。ありがとう! –

+0

あなたは正しいです。それはJavascriptの問題でした。 –

0

ここでは、HTMLとJavascriptコードの両方をどのように取得できたかの解決策を示します。

セレンライブラリを使用しました。

from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
import time 

#Using Firefox 48.0.2 and the new WebDriver 
caps = DesiredCapabilities.FIREFOX 
caps["marionette"] = True 
br = webdriver.Firefox(capabilities=caps) 
br.get('http://XXX.XXX.XXX.XXX/') 

#Input Username and Password 
username = br.find_element_by_name('SOME_NAME') 
username.send_keys('USERNAME') 
password = br.find_element_by_name('SOME_NAME') 
password.send_keys('PASSWORD') 
form = br.find_element_by_name('submitButton') 
form.submit() 
time.sleep(20) 

#THIS IS WHAT IS DIFFERENT... 
td_element = br.find_element_by_xpath('/html') 
html = br.execute_script("return arguments[0].innerHTML;", td_element) 
print html