Как очистить тег canvas и почему он не отображается в моем браузере?

#python #html #selenium #web-scraping

Вопрос:

На этом изображении выделен html-контент, а красный кружок-это часть, которую необходимо очистить.Номер телефона указан в теге canvas. Я попытался очистить тег, но он возвращает «Ваш браузер не поддерживает тег HTML5 canvas».

https://www.mudah.my/malaysia/cars-for-sale/audi?o=1

Это ссылка, по которой есть список автомобилей, для которых необходимо очистить контакты.Любые предложения о том, как я могу решить эту проблему, приветствуются.

 for link in car_links:
    print('link: ', link)
    driver.get(link)

    try:
        dealer_name = driver.find_element_by_xpath('/html/body/div[1]/div[6]/div/div[2]/div[1]/div[4]/div/div[1]/div[2]/div[1]/a').text
        print(dealer_name)
        try:
            driver.execute_script("arguments[0].scrollIntoView(true);",WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[6]/div/div[2]/div[1]/div[5]/button[2]'))))
            button1 = WebDriverWait(driver, 20).until(EC.element_to_be_clickable(
                (By.XPATH, '/html/body/div[1]/div[6]/div/div[2]/div[1]/div[5]/button[2]')))
            button1.click()
            phone = driver.find_element_by_id('phone-image').text
            print(phone)
        except:
            print('No name')
            print('No phone no')
    except:
        pass
 

Ответ №1:

Вы пытаетесь получить текст элемента сразу после нажатия на предыдущий элемент. Номеру телефона требуется некоторое время, чтобы появиться там. Так что вам просто нужно добавить немного ожидания или задержки перед этим. Подобный этому:

 from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 20)

button1.click()
phone = wait.until(EC.visibility_of_element_located((By.ID, 'phone-image'))).text
 

Ответ №2:

Номер телефона хранится на странице в форме Json. Чтобы получить номер телефона, вы можете сделать:

 import json
import requests
from bs4 import BeautifulSoup

url = "https://www.mudah.my/Audi RS6 4 0 AVANT TFSI QUATTRO Unreg 2016-87091288.htm"

soup = BeautifulSoup(requests.get(url).content, "html.parser")
data = json.loads(soup.select_one("#__NEXT_DATA__").contents[0])
# uncomment this to print all data:
# print(json.dumps(data, indent=4))
ad_id = soup.select_one("[gravity-itemid]")["gravity-itemid"]

ad_data = data["props"]["initialState"]["adDetails"]["byID"][ad_id]

print("Phone:", ad_data["attributes"]["phone"])
 

С принтами:

 Phone: 0183888798
 

Комментарии:

1. Есть идеи о том, как я могу это сделать в selenium?

2. @trialaccount Вы можете загрузить страницу с помощью selenium, а затем указать источник beautifulsoup . Сценарий тогда будет тот же самый.

3. Мне трудно это реализовать

4. Я сделал следующее изменение в soup => soup = BeautifulSoup(драйвер, «html.парсер»)

5. но я получил сообщение об ошибке TypeError: объект типа «WebDriver» не имеет len()