如何使用selenium/python让网站中的所有下拉箭头显示其内容

如何使用selenium/python让网站中的所有下拉箭头显示其内容,python,selenium,web-scraping,Python,Selenium,Web Scraping,我试图从一个个人项目的网站上获取文本,但我需要的文本存储在几层下拉框之后 i、 e.(V是一个向下箭头,可单击以显示更多信息) 产品组(V) 产品名称(V) 保护等级(V) 评级说明五星级评级目标数量 因此,我想从这个产品名称,评级和目标编号的描述 到目前为止,我已经能够通过首先获取与向下箭头匹配的元素来获取产品名称 element_list = [] for items in range(0,13): try: temp = driver.find_element(By

我试图从一个个人项目的网站上获取文本,但我需要的文本存储在几层下拉框之后

i、 e.(V是一个向下箭头,可单击以显示更多信息)

产品组(V)

产品名称(V)

保护等级(V)

评级说明五星级评级目标数量

因此,我想从这个产品名称,评级和目标编号的描述

到目前为止,我已经能够通过首先获取与向下箭头匹配的元素来获取产品名称

element_list = []
for items in range(0,13):
    try:
        temp = driver.find_element(By.XPATH, '//*[@id="grouping_{}"]/a/div/div/span'.format(items))
        element_list.append(temp)
    except:
        continue
然后我浏览了一下列表,用0.5秒的间隔点击每个向下箭头,这样网站就可以进行操作并刷新

for i in range(1,len(element_list)): 
    webdriver.ActionChains(driver).move_to_element(element_list[i]).click(element_list[i]).perform()
    time.sleep(0.5)
这显示了产品分组中的每个产品,然后我可以使用CSS标记获得产品名称

product_titles = []
titles = driver.find_elements_by_css_selector('.seat-title')
for title in range(len(titles)):
    product_titles.append(titles[title].text)
但是现在我需要点击每个产品,然后点击防护等级链接来显示最终等级。有没有比手动查找要单击的元素然后单击更简单的方法。到目前为止,这个网站上的大多数东西似乎没有CSS ID,我一直在使用XPATH查找正确的元素,但我认为应该有一种更快的方法来获得我想要的东西

我正在努力抓取的网站是

在浏览DOM之前,首先要检查数据是否没有通过XHR请求(F12->Network->XHR)。就是这样

第二件事是探索数据分支。查看:了解数据结构的外观

第一个链接指向页面上的所有项目。第二个链接允许您获取特定项目的所有详细信息,这里是对象“1108”

以下代码:

import requests as rq
# the following two lines allow to remove warnings created by "verify=False".
import urllib3 
urllib3.disable_warnings()

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0"}
url = "https://www.childcarseats.com.au/api/v1/child_car_seats/filter_data/retrieve?_format=json"
resp = rq.get(url, headers=headers, verify=False).json()

seats = resp["seats"]


url_2 = "https://www.childcarseats.com.au/api/v1/child_car_seats/seat_extra/retrieve/"
data = []
for (i, seat) in enumerate(seats):
    nid = seat["nid"]
    product_name = seat["product_name"]
    resp2 = rq.get(url_2 + nid, headers=headers, verify=False).json()
    resp2 = resp2["tests"]

    for k1 in resp2.keys(): # through rating schemes keys
        for k2 in resp2[k1].keys(): # through seat types keys
            for k3 in resp2[k1][k2].keys(): # through test types (protection / ease of use)
                for k4 in resp2[k1][k2][k3].keys(): # through test names

                    item = resp2[k1][k2][k3][k4][0]
                    score, score_max = item["score"], item["score_maximum"]

                    data.append({"product_id":  nid, 
                                 "product_name":product_name,
                                 "rating_scheme": k1,
                                 "seat_type": k2,
                                 "test_type": k3,
                                 "test_name": k4,
                                 "test_score": score,
                                 "test_score_max": score_max
                                })
    print("%s/%s" % (i+1, len(seats)))
获取所需的数据(“数据”变量)


注意:我设置了“verify=False”,因为我在使用SSL证书时遇到了一些问题。如果您愿意,请尝试不使用。

您可以将网站URL发送给我们吗?请添加URL和完整代码。我只看到最右侧的下拉列表。还有,目标数量是多少?价格?什么是评级描述?在每种情况下都需要访问实际的产品URL吗?对不起,我不清楚。只有一个下拉按钮。然后,您必须单击产品名称以打开下一层。之后,您需要单击“保护”或“易用性”名称以显示其各自的评级。我以个人评级(即在正面和侧面碰撞中保持其结构完整性(关键特征))和分数(即12/12)命名。我基本上希望每个产品在单独的评级级别上的评级。每个测试的评级在哪里?在数据中,“测试分数”。如果你想要十进制分数,它只是:score/score\u maxE.g。如果您查看Nuna Pipa Klik(使用ISOFix测试)CF-06-001AU正面碰撞中假人躯干的载荷分布情况,其中等级为1?那么,分数=2.8,最大分数=8,因此十进制分数=0.35。5:5*0.35=1.75;因此,计算的_分数=2(四舍五入)et星星(完整星星)=1.+用于解释