ฉันจะเลือกคำแนะนำการค้นหาโดยใช้ซีลีเนียมได้อย่างไร? ไซต์ป้องกันไม่ให้ฉันคลิกส่งต้องมีการเลือก

Aug 18 2020

ฉันพยายามทำให้การค้นหาอพาร์ทเมนท์ชั่วคราวง่ายขึ้นเล็กน้อยสำหรับตัวเอง แต่เว็บไซต์ที่มีรายชื่ออพาร์ทเมนต์เหล่านี้ทำให้ฉันต้องเลือกข้อเสนอแนะจากรายการแบบเลื่อนลงก่อนที่ฉันจะสามารถคลิกส่งได้ ไม่ว่ารายการในช่องค้นหาอาจจะสมบูรณ์แค่ไหนก็ตาม

ความหวังสูงสุดคือฉันสามารถส่งต่อไปยังผลการค้นหาจากนั้นดึงข้อมูลการติดต่อจากแต่ละรายชื่อ ฉันสามารถดึงข้อมูลที่ต้องการจากรายชื่อโดยใช้ Beautiful Soup และ Request แต่ฉันต้องวาง URL ของรายชื่อนั้นลงในรหัสของฉัน ฉันไม่ได้ไปไกลขนาดนั้น หากใครมีข้อเสนอแนะเกี่ยวกับวิธีหลีกเลี่ยงหน้า Landing Page เพื่อไปยังรายชื่อที่เกี่ยวข้องโปรดแจ้งให้เราทราบ

ฉันลองแค่ต่อชื่อเมืองและชื่อรัฐลงในแถบที่อยู่โดยดูว่ามันเขียนอย่างไรหลังจากการค้นหาที่ประสบความสำเร็จ แต่ไม่ได้ผล

เว็บไซต์ที่เป็นหมี่ Monteurzimmer

นี่คือรหัสของฉัน:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select


driver = webdriver.Firefox()


webpage = r"https://mein-monteurzimmer.de"
print('Prosim vnesi zeljeno mesto') #Please enter the town to search
searchterm = input()

driver.get(webpage)

sbox = driver.find_element_by_xpath("/html/body/main/cpagearea/section/div[2]/div/section[1]/div/div[1]/section/form/div/input")
sbox.send_keys(searchterm)

ddown = driver.find_element_by_xpath("/html/body/main/cpagearea/section/div[2]/div/section[1]/div/div[1]/section/form/div")
ddown.select_by_value(1)

webdriver.wait(2)

#select = driver.find_element_by_xpath("/html/body/main/cpagearea/section/div[2]/div/section[1]/div/div[1]/section/form/div")

submit = driver.find_element_by_xpath("/html/body/main/cpagearea/section/div[2]/div/section[1]/div/div[1]/section/form/button")
submit.click

เมื่อฉันตรวจสอบช่องค้นหาฉันไม่พบสิ่งที่เกี่ยวข้องกับคำแนะนำจนกว่าฉันจะป้อนข้อความ จากนั้นฉันไม่สามารถคลิกที่โค้ด HTML ได้เพราะจะปิดคำแนะนำ มันค่อนข้างน่าผิดหวัง

นี่คือภาพหน้าจอ:

ดังนั้นฉันจึงพยายามเลือกบางอย่างอย่างสุ่มสี่สุ่มห้า

ข้อผิดพลาดที่นี่คือ:

AttributeError: วัตถุ 'FirefoxWebElement' ไม่มีแอตทริบิวต์ 'select_by_value'

ฉันลองบางอย่างด้วยการเลือก แต่ไม่ได้ผลกับวิธีที่ฉันลองทำ

ฉันนิ่งงันและวิธีแก้ปัญหาที่ฉันพบนั้นเฉพาะเจาะจงสำหรับไซต์อื่น ๆ เช่น Google หรือ Amazon และฉันไม่สามารถเข้าใจได้หากเป็นเช่นนั้น

ไม่มีใครรู้ว่าฉันจะทำงานนี้ได้อย่างไร?

นี่คือรหัสสำหรับรับข้อมูลจากรายชื่อซึ่งฉันจะต้องขยายเพื่อรับข้อมูลอื่น ๆ :

import bs4, requests

def getMonteurAddress(MonteurUrl):
    res = requests.get(MonteurUrl)
    res.raise_for_status()

    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    elems = soup.select('section.c:nth-child(4) > div:nth-child(2) > div:nth-child(2) > dl:nth-child(1) > dd:nth-child(2)')
    return elems[0].text.strip()




address = getMonteurAddress('https://mein-monteurzimmer.de/105742/monteurzimmer/deggendorf-monteurzimmer-deggendorf-pensionfelix%40googlemailcom')
print('Naslov je ' + address) #print call to see if it gets the right data

คำตอบ

1 rahulrai Aug 18 2020 at 20:20

อย่างที่คุณเห็นเมื่อคุณพิมพ์จะมีการสร้างรายการ div ตอนนี้คุณต้องได้รับตัวระบุตำแหน่งที่ถูกต้องสำหรับ div เหล่านี้ ในการรับตัวระบุตำแหน่งสำหรับ div ที่สร้างขึ้นเหล่านี้คุณต้องตรวจสอบองค์ประกอบในโหมด debug pause (F12 -> Source Tab -> F8)

ลองใช้รหัสด้านล่างเพื่อเลือกที่อยู่แรกที่ตรงกันตามที่คุณพิมพ์

sbox = driver.find_element_by_xpath("//input[@placeholder='Adresse, PLZ oder Ort eingeben']")
sbox.send_keys(searchterm)
addessXpath = "//div[contains(text(),'"+searchterm+"')]"
driver.find_element_by_xpath(addessXpath).click()

หมายเหตุ: หากมีที่อยู่ที่ตรงกันมากกว่าหนึ่งแห่งระบบจะเลือกที่อยู่แรก