能够通过 XPATH 搜索元素,无法通过 CLASS_NAME 或 CSS_SELECTOR 搜索元素

问题描述 投票:0回答:1

我正在尝试从 Google 地图中抓取数据,但我无法成功完成此操作,因为我无法获取 find_elements(通过 class_name 或 css_selector),但我能够通过 XPATH 获取该元素和问题XPATH 一直在变化吗?

我要获取的 Class_Name 是

Io6YTe fontBodyMedium kR99db 
。 这些类名有多个,我想从中获取所有数据并存储数据,但是当我这样做时
find_elements(by class_name or css_selector)
它返回一个空列表。

这是 HTML 部分:

<div class="m6QErb " aria-label="Information for Jio Center" role="region">
   <div ve-visible="cf" jslog="39448;"></div>
   <div ve-visible="cf" jslog="39497;"></div>
   <div class="RcCsl fVHpi w4vB1d NOE9ve M0S7ae AG25L ">
      <div class="OyjIsf "></div>
      <button class="CsEnBe" jsaction="pane.wfvdle118;clickmod:pane.wfvdle118;focus:pane.focusTooltip;blur:pane.blurTooltip" aria-label="Address: HM3V+GF6, Sector No.11, Hiran Magri, Udaipur, Rajasthan 313001 " data-item-id="address" data-tooltip="Copy address" jslog="36622; track:click; mutable:true;">
         <div class="AeaXub">
            <div class="cXHGnc">
               <div class="Eottgc "><img class="Liguzb " alt="" src="//www.gstatic.com/images/icons/material/system_gm/2x/place_gm_blue_24dp.png"></div>
            </div>
            <div class="rogA2c ">
               <div class="Io6YTe fontBodyMedium kR99db ">HM3V+GF6, Sector No.11, Hiran Magri, Udaipur, Rajasthan 313001</div>
               <div class="gSkmPd fontBodySmall CuiGbf DshQNd"></div>
            </div>
         </div>
      </button>
      <div class="UCw5gc">
         <div class="C9yzub">
            <div class="etWJQ kdfrQc ">
               <button class="g88MCb S9kvJb " jsaction="pane.wfvdle119;keydown:pane.wfvdle119;mouseover:pane.wfvdle119;mouseout:pane.wfvdle119;focus:pane.focusTooltip;blur:pane.blurTooltip" aria-label="Copy address" data-tooltip="Copy address" data-value="Copy address" jslog="38087;track:click;mutable:true;">
                  <span class="DVeyrd ">
                     <div class="OyjIsf zemfqc"></div>
                     <img class="EgL07d" aria-hidden="true" draggable="false" alt="Copy address" src="//www.gstatic.com/images/icons/material/system_gm/2x/content_copy_gm_grey_18dp.png">
                  </span>
               </button>
            </div>
         </div>
      </div>
   </div>
   <div class="OqCZI fontBodyMedium WVXvdc" jslog="36914;metadata:WyIwYWhVS0V3alJydENGcFlHQkF4VVZabXdHSGVXZkNfd1E4QmNJQlNnQSJd">
      <div data-hide-tooltip-on-mouse-move="true" class="OMl5r hH0dDd jBYmhd" aria-expanded="false" role="button" tabindex="0" jsaction="pane.openhours.189.dropdown; keydown:pane.openhours.189.dropdown" jslog="14925;track:click,keydown_click;mutable:true;metadata:WyIwYWhVS0V3alJydENGcFlHQkF4VVZabXdHSGVXZkNfd1E4QmNJQlNnQSJd">
         <div class="OyjIsf "></div>
         <img class="OdW2qd" src="//www.gstatic.com/images/icons/material/system_gm/2x/schedule_gm_blue_24dp.png" aria-label="Hours">
         <div class="MkV9">
            <div class="o0Svhf"><span class="ZDu9vd"><span><span style="font-weight: 400; color: rgba(217,48,37,1.00);">Closed</span><span style="font-weight: 400;"> ⋅ Opens 10 pm</span></span></span> <span role="img" class="rh7Scc LaAyid M5ziBd " aria-label="Show open hours for the week"></span></div>
         </div>
      </div>
      <div aria-label="Tuesday, 10 pm to 12 am; Wednesday, 10 pm to 12 am; Thursday, 10 pm to 12 am; Friday, 10 pm to 12 am; Saturday, 10 pm to 12 am; Sunday, Closed; Monday, 10 pm to 12 am. Hide open hours for the week" class="t39EBf GUrTXd">
         <div>
            <table class="eK4R0e fontBodyMedium">
               <tbody>
                  <tr class="y0skZc">
                     <td class="ylH6lf fontTitleSmall">
                        <div>Tuesday</div>
                     </td>
                     <td class="mxowUb" role="text" aria-label="10 pm to 12 am">
                        <ul class="fontTitleSmall">
                           <li class="G8aQO">10 pm–12 am</li>
                        </ul>
                     </td>
                     <td class="HuudEc">
                        <button class="mWUh3d" data-hide-tooltip-on-mouse-move="true" data-value="Tuesday, 10 pm–12 am" jsaction="pane.openhours.189.copy; ; focus:pane.focusTooltip; blur:pane.blurTooltip" data-tooltip="Copy open hours" aria-label="Tuesday, 10 pm to 12 am, Copy open hours">
                           <div class="OyjIsf "></div>
                           <div class="GYnni"></div>
                        </button>
                     </td>
                  </tr>
                  <tr class="y0skZc">
                     <td class="ylH6lf ">
                        <div>Wednesday</div>
                     </td>
                     <td class="mxowUb" role="text" aria-label="10 pm to 12 am">
                        <ul>
                           <li class="G8aQO">10 pm–12 am</li>
                        </ul>
                     </td>
                     <td class="HuudEc">
                        <button class="mWUh3d" data-hide-tooltip-on-mouse-move="true" data-value="Wednesday, 10 pm–12 am" jsaction="pane.openhours.189.copy; ; focus:pane.focusTooltip; blur:pane.blurTooltip" data-tooltip="Copy open hours" aria-label="Wednesday, 10 pm to 12 am, Copy open hours">
                           <div class="OyjIsf "></div>
                           <div class="GYnni"></div>
                        </button>
                     </td>
                  </tr>
                  <tr class="y0skZc">
                     <td class="ylH6lf ">
                        <div>Thursday</div>
                     </td>
                     <td class="mxowUb" role="text" aria-label="10 pm to 12 am">
                        <ul>
                           <li class="G8aQO">10 pm–12 am</li>
                        </ul>
                     </td>
                     <td class="HuudEc">
                        <button class="mWUh3d" data-hide-tooltip-on-mouse-move="true" data-value="Thursday, 10 pm–12 am" jsaction="pane.openhours.189.copy; ; focus:pane.focusTooltip; blur:pane.blurTooltip" data-tooltip="Copy open hours" aria-label="Thursday, 10 pm to 12 am, Copy open hours">
                           <div class="OyjIsf "></div>
                           <div class="GYnni"></div>
                        </button>
                     </td>
                  </tr>
                  <tr class="y0skZc">
                     <td class="ylH6lf ">
                        <div>Friday</div>
                     </td>
                     <td class="mxowUb" role="text" aria-label="10 pm to 12 am">
                        <ul>
                           <li class="G8aQO">10 pm–12 am</li>
                        </ul>
                     </td>
                     <td class="HuudEc">
                        <button class="mWUh3d" data-hide-tooltip-on-mouse-move="true" data-value="Friday, 10 pm–12 am" jsaction="pane.openhours.189.copy; ; focus:pane.focusTooltip; blur:pane.blurTooltip" data-tooltip="Copy open hours" aria-label="Friday, 10 pm to 12 am, Copy open hours">
                           <div class="OyjIsf "></div>
                           <div class="GYnni"></div>
                        </button>
                     </td>
                  </tr>
                  <tr class="y0skZc">
                     <td class="ylH6lf ">
                        <div>Saturday</div>
                     </td>
                     <td class="mxowUb" role="text" aria-label="10 pm to 12 am">
                        <ul>
                           <li class="G8aQO">10 pm–12 am</li>
                        </ul>
                     </td>
                     <td class="HuudEc">
                        <button class="mWUh3d" data-hide-tooltip-on-mouse-move="true" data-value="Saturday, 10 pm–12 am" jsaction="pane.openhours.189.copy; ; focus:pane.focusTooltip; blur:pane.blurTooltip" data-tooltip="Copy open hours" aria-label="Saturday, 10 pm to 12 am, Copy open hours">
                           <div class="OyjIsf "></div>
                           <div class="GYnni"></div>
                        </button>
                     </td>
                  </tr>
                  <tr class="y0skZc">
                     <td class="ylH6lf ">
                        <div>Sunday</div>
                     </td>
                     <td class="mxowUb" role="text" aria-label="Closed">
                        <ul>
                           <li class="G8aQO">Closed</li>
                        </ul>
                     </td>
                     <td class="HuudEc">
                        <button class="mWUh3d" data-hide-tooltip-on-mouse-move="true" data-value="Sunday, Closed" jsaction="pane.openhours.189.copy; ; focus:pane.focusTooltip; blur:pane.blurTooltip" data-tooltip="Copy open hours" aria-label="Sunday, Closed, Copy open hours">
                           <div class="OyjIsf "></div>
                           <div class="GYnni"></div>
                        </button>
                     </td>
                  </tr>
                  <tr class="y0skZc">
                     <td class="ylH6lf ">
                        <div>Monday</div>
                     </td>
                     <td class="mxowUb" role="text" aria-label="10 pm to 12 am">
                        <ul>
                           <li class="G8aQO">10 pm–12 am</li>
                        </ul>
                     </td>
                     <td class="HuudEc">
                        <button class="mWUh3d" data-hide-tooltip-on-mouse-move="true" data-value="Monday, 10 pm–12 am" jsaction="pane.openhours.189.copy; ; focus:pane.focusTooltip; blur:pane.blurTooltip" data-tooltip="Copy open hours" aria-label="Monday, 10 pm to 12 am, Copy open hours">
                           <div class="OyjIsf "></div>
                           <div class="GYnni"></div>
                        </button>
                     </td>
                  </tr>
               </tbody>
            </table>
            <div class="onOnO">
               <div class="">
                  <button class="M77dve " aria-label="Suggest an edit to open hours" jslog="119438;track:click;mutable:true;metadata:WyIwYWhVS0V3alpoY09QcFlHQkF4VkZTMndHSFZodUFFSVE4QmNJQmlnQiJd" jsaction="pane.wfvdle140">
                     <div class="BgrMEd cYlvTc VOgY4">
                        <div class="OyjIsf zemfqc"></div>
                        <span class="wNNZR fontTitleSmall">Suggest new hours</span>
                     </div>
                  </button>
               </div>
            </div>
         </div>
      </div>
      <div class="z6qSc GUrTXd">
         <div>
            <div></div>
            <div class="uLQcoc"></div>
         </div>
      </div>
   </div>
   <div class="RcCsl fVHpi w4vB1d NOE9ve M0S7ae AG25L ">
      <div class="OyjIsf "></div>
      <button class="CsEnBe" jsaction="pane.wfvdle120;clickmod:pane.wfvdle120" aria-label="Send Jio Center to your phone" data-item-id="send-to-device" jslog="141697; track:click; mutable:true;">
         <div class="AeaXub">
            <div class="cXHGnc">
               <div class="Eottgc "><img class="Liguzb " alt="" src="//maps.gstatic.com/consumer/images/icons/2x/send_to_mobile_alt_gm_blue_24dp.png"></div>
            </div>
            <div class="rogA2c ">
               <div class="Io6YTe fontBodyMedium kR99db ">Send to your phone</div>
               <div class="gSkmPd fontBodySmall CuiGbf DshQNd"></div>
            </div>
         </div>
      </button>
      <div class="UCw5gc">
         <div class="C9yzub"></div>
      </div>
   </div>
   <div class="RcCsl fVHpi w4vB1d NOE9ve M0S7ae AG25L ">
      <div class="OyjIsf "></div>
      <a class="CsEnBe" jsaction="pane.wfvdle121;clickmod:pane.wfvdle121" aria-label="Claim this business" data-item-id="merchant" jslog="17658; track:click; mutable:true;metadata:WyIwYWhVS0V3alJydENGcFlHQkF4VVZabXdHSGVXZkNfd1FfMWtJSnlnUSJd" href="https://business.google.com/create?fp=9749311200610629361&amp;hl=en&amp;authuser=0&amp;gmbsrc=in-en-et-ip-z-gmb-s-z-l~mrc%7Cclaimbz%7Cu&amp;ppsrc=GMBMI&amp;utm_campaign=in-en-et-ip-z-gmb-s-z-l~mrc%7Cclaimbz%7Cu&amp;utm_source=gmb_mrc81&amp;utm_medium=et&amp;getstarted&amp;lis=1">
         <div class="AeaXub">
            <div class="cXHGnc">
               <div class="Eottgc "><img class="Liguzb " alt="" src="//www.gstatic.com/images/icons/material/system_gm/2x/verified_user_gm_blue_24dp.png"></div>
            </div>
            <div class="rogA2c ">
               <div class="Io6YTe fontBodyMedium kR99db ">Claim this business</div>
               <div class="gSkmPd fontBodySmall CuiGbf DshQNd"></div>
            </div>
         </div>
      </a>
      <div class="UCw5gc">
         <div class="C9yzub"></div>
      </div>
   </div>
</div>

链接:https://www.google.co.in/maps/place/Jio+Center/@24.5537982,73.6833263,15z/data=!4m10!1m2!2m1!1sJio+Center!3m6!1s0x3967ef99640710a3:0x874c82e2052236f1 ! 8m2!3d24.5537986!4d73.693626!15sCgpKaW8gQ2VudGVyIgOIAQGSARBjb3Jwb3JhdGVfb2ZmaWNl4AEA!16s%2Fg%2F11h9y566w1?条目=ttu

我使用的代码:

import time
from selenium import webdriver
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = ChromeOptions()
options.add_argument("--start-maximized")
options.add_experimental_option("excludeSwitches",["enable-automation"])
driver = webdriver.Chrome(executable_path='C:\\chromedriver-win64\\chromedriver.exe',options=options)
driver.get("https://www.google.com/maps")

searchBar = driver.find_element(By.XPATH, value ='//*[@id="searchboxinput"]')
searchBar.send_keys("jio center")
# searchTerm = input("Enter the search term: ")
# searchBar.send_keys(searchTerm)
driver.find_element(By.XPATH, value ='//*[@id="searchbox-searchbutton"]').click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, 'hfpxzc')))
# input("Scroll to end of list and press Enter:")

allCompanies = driver.find_elements(By.CLASS_NAME, 'hfpxzc')
for company in allCompanies:
    company.click()
    time.sleep(2)
    allDetailsXPATH = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//*[@id="QA0Szd"]/div/div/div[1]/div[3]/div/div[1]/div/div/div[2]/div[7]')))
    allDetails = allDetailsXPATH.find_elements(By.CSS_SELECTOR,'Io6YTe.fontBodyMedium.kR99db')
    print(allDetails)

    companyName = driver.find_element(By.XPATH, '//*[@id="QA0Szd"]/div/div/div[1]/div[3]/div/div[1]/div/div/div[2]/div[2]/div/div[1]/div[1]/h1').text
    print(f"{companyName} done.\n")

driver.quit()
python selenium-webdriver xpath css-selectors getelementsbyclassname
1个回答
1
投票

正确的 CSS_SELECTOR 是:

allDetails = allDetailsXPATH.find_elements(By.CSS_SELECTOR, 'div.Io6YTe.fontBodyMedium.kR99db')

完整代码:

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

options = ChromeOptions()
options.add_argument("--start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])

driver = Chrome(options=options)
wait = WebDriverWait(driver, 10)

url = "https://www.google.co.in/maps/place/Jio+Center/@24.5537982,73.6833263,15z/data=!4m10!1m2!2m1!1sJio+Center!3m6!1s0x3967ef99640710a3:0x874c82e2052236f1!8m2!3d24.5537986!4d73.693626!15sCgpKaW8gQ2VudGVyIgOIAQGSARBjb3Jwb3JhdGVfb2ZmaWNl4AEA!16s%2Fg%2F11h9y566w1?entry=ttu"
driver.get(url)

allDetailsXPATH = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="QA0Szd"]/div/div/div[1]/div[3]/div/div[1]/div/div/div[2]/div[7]')))
allDetails = allDetailsXPATH.find_elements(By.CSS_SELECTOR, 'div.Io6YTe.fontBodyMedium.kR99db')
print(allDetails)
print(len(allDetails))

输出:

[<selenium.webdriver.remote.webelement.WebElement (session="5b2e1a6dc7d9b93befdd48746027a868", element="5B45CCB6FF176A5259BAD24EE4A9C1D0_element_574")>, <selenium.webdriver.remote.webelement.WebElement (session="5b2e1a6dc7d9b93befdd48746027a868", element="5B45CCB6FF176A5259BAD24EE4A9C1D0_element_591")>, <selenium.webdriver.remote.webelement.WebElement (session="5b2e1a6dc7d9b93befdd48746027a868", element="5B45CCB6FF176A5259BAD24EE4A9C1D0_element_597")>]
3
© www.soinside.com 2019 - 2024. All rights reserved.