web-scraping, некоторые divs не появляются - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь очистить HTML-страницу со следующим кодом:

driver = webdriver.Chrome()
driver.get(url)
try:
    element = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.CLASS_NAME,
                                    "myclass")))  
    html = driver.page_source
    soup = bs(html, "lxml")
    print(html)
    dynamic_text = soup.find_all("div", {"class": "myclass"})  
except:
       print("Couldnt locate element")

HTML-страница открыта, но в моей консоли ide я вижу сообщение кроме. Кажется, что div с именем_класса "myclass" не найден. Однако, когда я проверяю полученную HTML-страницу, я вижу там div с именем этого класса.

div в html:

<div role="radio" data-ng-attr-id="{{radioId}}" data-ng-attr-tabindex="{{directToShow === strVm.data.selectedDirectToShow ? '0' : '-1'}}" data-ng-attr-aria-checked="{{directToShow === strVm.data.selectedDirectToShow ? 'true' : 'false'}}" class="trainBasicInfo ng-scope" data-ng-if="directToShow.date == undefined" data-ng-click="strVm.onSelectDirectToShow(directToShow, $event)" data-ng-class="{'active': directToShow === strVm.data.selectedDirectToShow}" id="railRadio_423" tabindex="-1" aria-checked="false">

Я добавил комментарий WebDriverWait и увидел вывод команды print (html). В выводе распечатки я не вижу div, но когда я проверяю осмотр открывшейся хромированной страницы, я вижу div.

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Я не знаю, какой class вы использовали, но класс при проверке с помощью Browser и класс со страницы источника не совпадают: DOM модифицируется JavaScript после загрузки исходный код страницы.

Попробуйте это:

driver = webdriver.Chrome()
driver.get(url)
try:
    elements = WebDriverWait(driver, 20).until(
    EC.presence_of_all_elements_located((By.XPATH,
                                    "//div[contains(@class, 'trainBasicInfo ng-scope')]")))  
    # By.XPATH gives more flexibility
    for element in elements: 
        print(element)
except:
       # print("Couldnt locate element")
       raise  # except with no Exception specified is prohibited

С inspect с помощью Chrom Dev Tools: enter image description here

С view-source:https://www.rail.co.il/pages/trainsearchresultnew.aspx?FSID=4170&TSID=5000&Date=20190630&Hour=1000&IOT=true&IBA=false&TSP=1561835762832: enter image description here

Вывод будет следующим:

30.06.2019 יום א'
00:46
רציף 1
19:12
19:58
רכבת 687
החלפה 19:44
תל אביב - ההגנה - רציף 3
רכבת 425
30.06.2019 יום א'
00:44
רציף 1
19:27
20:11
רכבת 689
החלפה 19:56
תל אביב - ההגנה - רציף 3
רכבת 529
30.06.2019 יום א'
00:42
רציף 1
19:57
20:39
רכבת 691
החלפה 20:26
תל אביב - ההגנה - רציף 3
רכבת 979
30.06.2019 יום א'
00:44
רציף 1
20:27
21:11
רכבת 693
החלפה 20:56
תל אביב - ההגנה - רציף 2
רכבת 531
30.06.2019 יום א'
00:44
רציף 1
21:27
22:11
רכבת 8695
החלפה 21:49
תל אביב - סבידור מרכז - רציף 3
רכבת 533
0 голосов
/ 30 июня 2019

Если вы используете Selenium, попробуйте следующее:

driver = webdriver.Chrome()
driver.get(url)

element = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CLASS_NAME,"myclass")))

html = driver.page_source
dynamic_text = driver.find_elements_by_xpath('//div') #this will be a list of all divs on the page, they all will be selenium object

Также имейте в виду, что некоторые сгенерированные скриптом материалы на странице могут отсутствовать, в зависимости от конфигурации вашего драйвера

...