2015-12-15 3 views
2

Это полное редактирование вопроса, потому что я, должно быть, неправильно задал свой вопрос на основе ответов, поэтому я постараюсь быть более ясным.Получение внутреннего HTML - Selenium, BeautifulSoup, Python

У меня есть объект, который я пытаюсь очистить. В моем коде, используемом на моем ноутбуке, у меня нет проблем с тем, чтобы это работало. Когда я перешел на Pythonanywhere, я больше не мог получить информацию, которую я ищу.

код, который работает на моей системе:

from urllib.request import urlopen 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import NoSuchElementException 
from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.common.keys import Keys 
from bs4 import BeautifulSoup 
import csv 
import time 
import re 

#68 lines of code for another section of the site above this working well on my system and on pythonanywhere. 

pageSource = driver.page_source 
bsObj = BeautifulSoup(pageSource) 

try: 
    parcel_number = bsObj.find(id="mParcelnumbersitusaddress_mParcelNumber") 
    s_parcel_number =parcel_number.get_text()       
except AttributeError as e: 
    s_parcel_number = "Parcel Number not found" 

# same kind of code (all working) that gets 10 more pieces of data 

# Tax Year 
try: 
    pause = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "TaxesBalancePaymentCalculator"))) 
    taxes_owed_2015_yr = bsObj.findAll(id="mGrid_RealDataGrid")[1].findAll('tr')[1].findAll('td')[0] 
except IndexError as e: 
    s_taxes_owed_2015_yr = "No taxes due" 

Этот код прекрасно работает на моем ноутбуке с fireforx - на Pythonanywhere, если я напечатать исходный текст для этой страницы я пытаюсь скрести я получаю следующее где мой стол должен быть:

<table border="0" cellpadding="5" cellspacing="0" class="WithBorder" width="100%"> 
<tbody><tr> 
<td id="TaxesBalancePaymentCalculator"><!--DONT_PRINT_START--> 
<span class="InputFieldTitle" id="mTabGroup_Taxes_mTaxChargesBalancePaymentInjected_mReportProcessingNote">Please wait while your current taxes are calculated.</span><img src="images/progress.gif"/> <!--DONT_PRINT_FINISH--></td> 
</tr> <!--DONT_PRINT_START--> 
<script type="text/javascript"> 
           function TaxesBalancePaymentCalculator_ScriptLoaded(pPageContent) 
           { 
            element('TaxesBalancePaymentCalculator').innerHTML = pPageContent; 
           } 
           function results_ready() 
           { 
            element('pay_button_area').style.display = 'block'; 
            element('pay_button_area2').style.display = 'block'; 
            element('pay_additional_things_area').style.display = 'block'; 
           } 
           var no_taxes_calculator = '&amp;nbsp;&lt;' + 'span class="MessageTitle"&gt;The tax balance calculator is not availab 
le.&lt;' + '/span&gt;'; 
           function no_taxes_calculator_available() 
           { 
            element('TaxesBalancePaymentCalculator').innerHTML = no_taxes_calculator; 
           } 
           function invalid() 
           { 
            element('TaxesBalancePaymentCalculator').innerHTML = no_taxes_calculator; 
           } 
           loadScript('injected/TaxesBalancePaymentCalculator.aspx?parcel_number=15-720-01-01-00-0-00-000'); 
           </script><script id="injected_taxesbalancepaymentcalculator_ScriptTag" type="text/javascript"></script> 
<tr id="pay_button_area" style="DISPLAY: none"> 
<td id="pay_button_area2"> 
<table border="0" cellpadding="2" cellspacing="0"> 
<tbody><tr> 

Я играл вокруг и обнаружили, что, если я получаю innerHTML (как ул):

element('TaxesBalancePaymentCalculator').innerHTML = pPageContent; 

что раздел содержит мои данные - проблема, я не могу преформы FindAll на веревочке, и мне нужно определенные строки из таблицы:

taxes_owed_2015_yr = bsObj.findAll(id="mGrid_RealDataGrid")[1].findAll('tr')[1].findAll('td')[0] 

мне нужна помощь о том, как получить этот элемент как объект (а не string), чтобы я мог использовать его в своих данных. Я пробовал так много вещей, что я не мог перечислить их всех здесь. Я действительно мог бы помочь.

Заранее спасибо.

+0

Я не помню никаких методов 'findAll' в' Python'. Это метод 'bs4' ... Импортируйте' bs4' в свой код? Что вы пытаетесь сделать с 'bsObj'? – Andersson

+0

Да, это метод bs4, и я импортировал bs4 --- пару сотен строк выше. Я пытаюсь получить информацию из таблицы, которая находится во внутреннем HTML - – Raymond

+0

Согласно документам, driver.get_attribute возвращает строку, следовательно, ошибку. – Steve

ответ

0

Как указано @Steve в комментариях, get_attribute возвращает строку, а не элементы HTML. Попробуйте заменить эту строку на некоторые из get_element_by_ *. Вы можете прочитать больше на документах http://selenium-python.readthedocs.org/api.html#selenium.webdriver.remote.webelement.WebElement.find_element_by_tag_name

Кроме того, вы используете beautifulsoup неправильным способом. Вам нужно создать свой объект BS4, передавая HTML в качестве параметра, а затем использовать FindAll в объекте:

soup = BeautifulSoup(html_as_plain_text) 
for element in soup.findAll(id="mGrid_RealDataGrid"): 
    #do your thing 
0

Из того, что я вижу в коде, который вы хотите получить innerHTML элемента и корм до BeautifulSoup для дальнейшего разбора. Прежде всего, вы, вероятно, нужно outerHTML, чтобы получить сам элемент в результирующем HTML, а также, что самое главное, вы должны инициализировать «суп» объект:

from bs4 import BeautifulSoup 

demo_div = driver.find_element_by_id('TaxesBalancePaymentCalculator') 
demo_html = demo_div.get_attribute('outerHTML') 

soup = BeautifulSoup(demo_html, "html.parser") # < YOU ARE MISSING THIS PART 
s_taxes_owed_2015_yr = soup.find_all(id="mGrid_RealDataGrid")[1].find_all('tr')[1].find_all('td')[0].get_text() 
print(s_taxes_owed_2015_yr) 
+0

Это выглядело хороший - но я все равно получаю элемент из-за пределов ошибки, потому что таблица никогда не загружается в браузере pythonanywhere firefox. – Raymond

+0

@ Раймонд и это отдельная проблема. Давайте избежим устранения нескольких проблем в одной теме. Пожалуйста, подумайте о создании отдельного вопроса с подробной информацией, если вам нужна помощь. Благодарю. – alecxe

3

Я думаю, что это может быть страница заряжания скорость разница. В начале вашего кода, у вас есть

pageSource = driver.page_source 
bsObj = BeautifulSoup(pageSource) 

Таким образом, вы создаете свой объект BeautifulSoup на основе содержимого страницы в этой точке. Позже, вы делаете это:

pause = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "TaxesBalancePaymentCalculator"))) 
taxes_owed_2015_yr = bsObj.findAll(id="mGrid_RealDataGrid")[1].findAll('tr')[1].findAll('td')[0] 

Итак, вы говорите WebDriver подождать, пока не появилось что-то, а затем сделать запрос к объекту BeautifulSoup, который вы создали ранее. Но у объекта BeautifulSoup все еще есть источник страницы с начала вашего скрипта, а не на новый источник страницы с объектом, которого вы ждали.

Попробуйте воссоздать bsObj на основе нового источника страницы после того, как вы сделали ожидание.

+1

Отлично --- отлично работает и благодарит за это. – Raymond

Смежные вопросы