#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()