如何单击一个元素并从链接的 xml 文件 (python) 中解析文本?

How to click on an element and parse text from linked xml file (python)?

我想解析来自以下网站的地址:https://filialen.migros.ch/de/center:46.8202,6.9575/zoom:8/

到目前为止,我可以访问该网站并单击所有弹出窗口。但是然后我需要 select 带有“1163 STANDORTE”的下拉菜单,我无法用我的代码找到它。 到目前为止我的代码:

import pandas as pd
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from bs4 import BeautifulSoup
import time
import itertools
import os
import numpy as np
import csv
import pdb

os.chdir("Directory")
options = webdriver.ChromeOptions()
options.add_argument("--incognito")
driver = webdriver.Chrome('Directory/chromedriver.exe')
driver.get("https://filialen.migros.ch/de/center:46.8202,6.9575/zoom:8/")
time.sleep(1)
try:
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@class='close-icon']"))).click() # if there is smth to click away
except:
    pass
time.sleep(4)

然后我尝试使用 span 和 button 元素以及几个导航选项:

#Version 1
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='sc-hKFxyN jdMjfs']"))).click() 

#Version 2
element = driver.find_element_by_class_name('sc-eCApnc kiXUNl sc-jSFjdj lcZmPE')
driver.execute_script("arguments[0].scrollIntoView();", element)
driver.execute_script("arguments[0].click();", element)

# Version 3    
element = driver.find_element_by_class_name('sc-eCApnc kiXUNl sc-jSFjdj lcZmPE')
driver.execute_script("arguments[0].click();", element)

#Version 4
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@class='sc-eCApnc kiXUNl sc-jSFjdj lcZmPE']"))).click() 

# Version 5
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[2]/div/main/nav/header/button[1]"))).click() 

# Version 6
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='1163 STANDORTE']"))).click() 

其实就是三个问题:

  1. 如果我只是手动打开 Chrome 上的 link,则会出现“1163 STANDORTE”,而如果我使用 [=36 打开 Chrome 上的 link =],更少的 STANDORTE 出现,但我无法缩小。所以我非常需要所有 1163 STANDORTE 出现。
  2. 我无法使用 class 和 XPATH 找到按钮。
  3. 按钮后面可能是link编辑的XML文件,地址信息只有在点击按钮后才会出现。最后我想抓取写在 XML 文件上的文本 linked 到那个按钮。

有什么建议吗?

我的问题与之前的问题类似:How to parse several attributes of website with same class name in python? and to

您要查找的数据基于 fetch / xhr 调用。

无需 抓取即可获取。见下文。

import requests

headers = {'Origin': 'https://filialen.migros.ch',
           'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'}

r = requests.get(
    'https://web-api.migros.ch/widgets/stores?key=loh7Diephiengaiv&aggregation_options[empty_buckets]=true&filters[markets][0][0]=super&filters[markets][0][1]=mno&filters[markets][0][2]=voi&filters[markets][0][3]=mp&filters[markets][0][4]=out&filters[markets][0][5]=spx&filters[markets][0][6]=doi&filters[markets][0][7]=mec&filters[markets][0][8]=mica&filters[markets][0][9]=res&filters[markets][0][10]=flori&filters[markets][0][11]=gour&filters[markets][0][12]=alna&filters[markets][0][13]=cof&filters[markets][0][14]=chng&verbosity=store&offset=0&limit=5000',
    headers=headers)
if r.status_code == 200:
    print('stores data below:')
    data = r.json()
    print(data)
else:
    print(f'Oops. Statud code is {r.status_code}')

几点:

  1. 启动 browser in full screen mode.

  2. 使用显式等待。

  3. 使用这个 xpath //span[contains(@aria-label, 'Standorte anzeigen')]/..

示例代码:

driver = webdriver.Chrome(driver_path)
driver.maximize_window()
#driver.implicitly_wait(50)
wait = WebDriverWait(driver, 20)

driver.get("https://filialen.migros.ch/de/center:46.8202,6.9575/zoom:8/")

try:
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@class='close-icon']"))).click() # if there is smth to click away
except:
    pass

wait.until(EC.element_to_be_clickable((By.XPATH, "//span[contains(@aria-label, 'Standorte anzeigen')]/.."))).click()

进口:

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

PS : 如果我们有 请检查 dev tools (Google chrome)是否在 HTML DOM 中唯一 个条目。

检查步骤:

Press F12 in Chrome -> 转到 element 部分 -> 执行 CTRL + F -> 然后粘贴 xpath 并查看是否需要 element正在 突出显示 1/1 匹配节点。