【问题标题】:Xpath nested spansXpath 嵌套跨度
【发布时间】:2021-07-02 09:57:49
【问题描述】:

我有以下html:

<div id="aod-price-1" class="a-section a-spacing-none a-padding-none">
    <span class="a-price" data-a-size="l" data-a-color="base">
        <span class="a-offscreen">$79.58</span>
        <span aria-hidden="true">
            <span class="a-price-symbol">$</span>
            <span class="a-price-whole">
                "79"
                <span class="a-price-decimal">.</span>
            </span>
            <span class="a-price-fraction">58</span>
        </span>
    </span>
</div>

我正在尝试提取 79.58 美元。

我用过:

priceFound = WebDriverWait(browser,10).until(EC.presence_of_all_elements_located((By.XPATH, "//span[@class='a-price']")))

这似乎有效,但并不完全符合我的预期:

返回:

$79
58

2 行,没有小数

我正在尝试提取完整的文本字符串:$79.58

我什至尝试过:

priceFound = WebDriverWait(browser,10).until(EC.presence_of_all_elements_located((By.XPATH, "//span[@class='a-offscreen']")))

和

priceFound = WebDriverWait(browser,10).until(EC.presence_of_all_elements_located((By.XPATH, "//span[@class='a-price-whole']")))

那两个没用。


根据目前的建议进行更新:

请注意,priceFound 是一个列表,在实际的 html 中有几个与上面类似的块(许多价格)。

<div id="aod-price-1" ... </div>
<div id="aod-price-2" ... </div>
<div id="aod-price-3" ... </div>
<div id="aod-price-4" ... </div>

为了清楚起见,我只发布了一个块,这就是我选择列表的原因。

priceFound = WebDriverWait(browser, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//span[@class='a-price']/span[@class='a-offscreen']")))

for price in priceFound:
    print(price.text)

这个返回:几个空行(具体是空回车)

我想知道我是否需要 XPath 中某处的 .text 引用?

更新 2:

我使用以下命令单击查看所有购买选择按钮。它确实有效。 然后引入稍微等待以等待价格填充。

  Expand_button_Element = browser.find_element_by_id("buybox-see-all-buying-choices")
  Expand_button_Element.click()

更新 3:

 wait = WebDriverWait(browser, 10);
        # wait for panel to be visible
     wait.until(EC.visibility_of_element_located((By.ID, "aod-container")))
        # this wait is probably no longer needed but left in to be safe
     priceFound = wait.until(EC.visibility_of_all_elements_located((By.XPATH,"//span[@class='a-price']")))
     for price in priceFound:
        print(price.text)

`

产生(例如): 77 美元 23 77 美元 24 79 美元 59 79 美元 94 78 美元 95 83 美元 94 79 美元 99 79 美元 95 79 美元 99 89 美元 00

但是当我尝试下面的代码建议时:

browser.find_element_by_id("buybox-see-all-buying-choices").click()
     wait = WebDriverWait(browser, 10);
     # wait for panel to be visible
     wait.until(EC.visibility_of_element_located((By.ID, "aod-container")))
     # this wait is probably no longer needed but left in to be safe
     priceFound = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "span.a-price > span.a-offscreen")))
     for price in priceFound:
        print(price.text)

我收到以下错误:

 priceFound =   
wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "span.a-
price > span.a-offscreen")))
File "/home/codingArea/.local/lib/python3.8/site-packages/selenium/webdriver
/support/wait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

这似乎是一个类似的问题:

How to get text from nested span tag in selenium

我认为这肯定会起作用:

priceFound = wait.until(EC.visibility_of_all_elements_located((By.XPATH,"//span[@class='a-price']/span[@class='a-offscreen']")))

但它超时了,这对我来说毫无意义。 我确保我运行的是最新的 selenium。

更新 4: 我使用了以下内容,它没有出错,但它产生了空行(如 10 个回车)。

priceFound = browser.find_elements_by_css_selector('span.a-offscreen')

     for price in priceFound:
        print(price.text)

【问题讨论】:

标签: python selenium-webdriver xpath


【解决方案1】:

您尝试了多种方法,但没有发布每种方法的结果。因此,作为基线,让我们从一些简单的事情开始,看看它是否能解决问题。如果没有,我们可以从那里开始工作。

让我们使用一个简单的 CSS 选择器并添加等待可见性。 (注意:您正在使用存在,但这只是意味着该元素在 DOM 中,而不是它是可见的)

# this code starts after clicking link to open product panel with pricing
browser.find_element_by_id("buybox-see-all-buying-choices").click()
wait = WebDriverWait(browser, 10);
# wait for panel to be visible
wait.until(EC.visibility_of_element_located((By.ID, "aod-container")))
# this wait is probably no longer needed but left in to be safe
priceFound = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "span.a-price > span.a-offscreen")))
for price in priceFound:
    print(price.text)

【讨论】:

  • 文本似乎确实存在,因为: WebDriverWait(browser, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@id='all-offers-display'] "))) 有效。它只是以我不想要的格式提取数据(即用回车符分割,我假设它来自 DOM 的更远部分)
  • 既然您已经提供了该页面的链接,我已经更新了代码。您忘记在问题中提及您单击了一个链接以打开包含价格的面板。这可能是问题的来源,所以我添加了等待面板。看看这是否有效。
  • 您评论中的定位器太高而无法使用...您将获得整个面板中的所有文本。我认为您对自己的尝试感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
相关资源
最近更新 更多