Selenium 通过 xpath 查找所有元素

Posted

技术标签:

【中文标题】Selenium 通过 xpath 查找所有元素【英文标题】:Selenium find all elements by xpath 【发布时间】:2015-11-10 06:55:12 【问题描述】:

我使用 selenium 废弃了一个滚动网站并执行了下面的代码

import requests
from bs4 import BeautifulSoup
import csv
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import unittest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
import unittest
import re

output_file = open("Kijubi.csv", "w", newline='')  

class Crawling(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.set_window_size(1024, 768)
        self.base_url = "http://www.viatorcom.de/"
        self.accept_next_alert = True

    def test_sel(self):
        driver = self.driver
        delay = 3
        driver.get(self.base_url + "de/7132/Seoul/d973-allthingstodo")
        for i in range(1,1):
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(2)
    html_source = driver.page_source
    data = html_source.encode("utf-8")

我的下一步是从网站上抓取特定信息,例如价格。

因此,我添加了以下代码:

 all_spans = driver.find_elements_by_xpath("/html/body/div[5]/div/div[3]/div[2]/div[2]/div[1]/div[1]/div")
    print(all_spans)
    for price in all_spans:
        Header = driver.find_elements_by_xpath("/html/body/div[5]/div/div[3]/div[2]/div[2]/div[1]/div[1]/div/div[2]/div[2]/span[2]")
        for span in Header:
            print(span.text)

但我只得到一个价格而不是所有价格。你能给我反馈一下我可以改进我的代码吗?谢谢:)

编辑

感谢你们,我设法让它运行起来。这是附加代码:

    elements = driver.find_elements_by_xpath("//div[@id='productList']/div/div")

    innerElements = 15

    outerElements = len(elements)/innerElements

    print(innerElements,  "\t", outerElements, "\t", len(elements))

    for j in range(1, int(outerElements)):

        for i in range(1, int(innerElements)):


            headline = driver.find_element_by_xpath("//div[@id='productList']/div["+str(j)+"]/div["+str(i)+"]/div/div[2]/h2/a").text

            price = driver.find_element_by_xpath("//div[@id='productList']/div["+str(j)+"]/div["+str(i)+"]/div/div[2]/div[2]/span[2]").text
            deeplink = driver.find_element_by_xpath("//div[@id='productList']/div["+str(j)+"]/div["+str(i)+"]/div/div[2]/h2/a").get_attribute("href")

            print("Header: " + headline + " | " + "Price: " + price + " | " + "Deeplink: " + deeplink)

现在我的最后一个问题是我仍然没有得到最后 20 个价格,这些价格有英文描述。我只取回有德语描述的价格。对于英文的,尽管它们共享相同的 html 结构,但它们不会被获取。

例如英文项目的html结构

     headline =   driver.find_element_by_xpath("//div[@id='productList']/div[6]/div[1]/div/div[2]/h2/a")

你们知道我要修改什么吗?任何反馈表示赞赏:)

【问题讨论】:

您拥有的 XPath 仅针对一个元素 - XPath 已被复制/自动生成,因此我建议您查看 XPath 规范和教程,以便您理解它。跨度> 【参考方案1】:

要获取该页面上的所有价格,您应该使用这样的 XPATH:

Header = driver.find_elements_by_xpath("//span[contains(concat(' ', normalize-space(@class), ' '), 'price-amount')]")

这意味着:找到所有具有 class=price-amount 的 span 元素,为什么这么复杂 - see here

但更简单的是通过 CSS 定位器找到相同的元素:

.price-amount

【讨论】:

感谢您的反馈

以上是关于Selenium 通过 xpath 查找所有元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium xpath 查找包含“下载”一词的所有元素?

使用 selenium 函数按名称查找元素时元素不可交互,但在通过 xpath 方法使用查找元素时有效

一个关于Selenium元素定位多个元素的问题

Selenium----Xpath定位

Selenium-xpath定位详解

XPATH 要想获取的东西里不分段,不变成列表就用STRING(),不用TEXT()