2016-08-29 3 views
0

Я в процессе извлечения некоторого HTML-кода, используя «Механизировать». Однако у меня проблема с выведенным кодом HTML. По сути, кажется, что Mechanize заменяет содержимое внутри определенных элементов на «(n/a)».Python Механизировать HTML-код, отличный от Firebug Код 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, который не поддерживается с помощью механизации, и, таким образом, вы получаете HTML в его оригинальной форме, то есть контент до того, как какой-либо Javascript будет выполнен.

И как я могу это исправить?

Не с механизированным, но вам нужно какое-то решение, которое поддерживает 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