【问题标题】:Get text from g tag within svg tag using Selenium and Python使用 Selenium 和 Python 从 svg 标签中的 g 标签获取文本
【发布时间】:2020-07-28 06:55:13
【问题描述】:

我正在尝试使用 selenium 从类标签中获取文本,但我有点走到了死胡同。所有类名都是相同的“legend-row”,但我只需要第三个,即具有“1.09TB”文本的那个。

我试图通过 xpath 找到元素,但没有运气,我设法从这些类中获取值的唯一方法是使用下面的代码行

driver.find_element_by_class_name("legend-row").text

这让我得到了所有的文本,134.46Tb、8.96TB、1.09TB 和 90% 的阈值。 有什么办法只能查询第三个吗?请参阅下面来自 URL 的类

<g class="legend" style="font-size: 14px;">
    <g class="legend-row" transform="translate(102,-32.400000000000006)">
        <rect y="-30.599999999999998" width="14" height="14" style="fill: rgb(125, 123, 140); stroke: rgb(125, 123, 140);"/>
        <text x="18" y="-18">Allocated:</text>
        <text x="109.421875" y="-18"> 134.46 TB</text>
    </g>
    <g class="legend-row" transform="translate(102,-10.800000000000004)">
        <rect y="-30.599999999999998" width="14" height="14" style="fill: rgb(110, 37, 133); stroke: rgb(110, 37, 133);"/>
        <text x="18" y="-18">Spare:</text>
        <text x="109.421875" y="-18"> 8.96 TB</text>
    </g>
    <g class="legend-row" transform="translate(102,10.799999999999997)">
        <rect y="-30.599999999999998" width="14" height="14" style="fill: rgb(130, 224, 170); stroke: rgb(130, 224, 170);"/>
        <text x="18" y="-18">Unallocated:</text>
        <text x="109.421875" y="-18"> 1.09 TB</text>
    </g>
    <g class="legend-th-row" transform="translate(102,32.39999999999999)">
        <text x="0" y="0" class="chart-status-icon" style="font-size: 14px; fill: rgb(242, 175, 0);"></text>
        <text x="18" y="0">Threshold Level: 90%</text>
    </g>
</g>

感谢您的帮助,

【问题讨论】:

  • 能否请您指向我们的 URL,以便我们进行调查。
  • 嘿@Pythonologist 我正在报废的 url 不向公众开放,它是来自本地网络中服务器的内部 URL。如果我过去这里的源页面会有帮助吗?
  • 您对索引号 [3] 的看法是正确的,但由于某种原因无法找到该元素。这是第三个元素的 xpath "//*[@id="sc-storage-center-top-disk-folders_0"]/div/sc-storage-center-top-disk-folders/div/div[2 ]/dui-donut-chart/svg/g/g/g[3]" 但如果我尝试 "driver.find_element_by_xpath("""//*[@id="sc-storage-center-top-disk-folders_0 "]/div/sc-storage-center-top-disk-folders/div/div[2]/dui-donut-chart/svg/g/g/g[3]""").text" 我明白了消息“消息:无法找到元素”
  • 这是我从您建议的答案中得到的信息。 "消息:无法定位元素:(//g[@class='legend']/g[@class='legend-row'])[3]"
  • @PeterFranca 正如你提到的..//dui-donut-chart/svg/g/g/g[3],你能用基于文本的html更新问题吗?

标签: python selenium svg xpath css-selectors


【解决方案1】:

要打印文本 1.09 TB,您必须为visibility_of_element_located() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

  • 使用XPATHtext属性:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//dui-donut-chart/*[name()='svg']/*[name()='g']/*[name()='g']//*[name()='g']//text[., 'Unallocated:']//following::text[1]"))).text)
    
  • 使用CSS_SELECTORget_attribute()

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "dui-donut-chart>svg>g>g g:nth-of-type(3) text:nth-of-type(2)"))).get_attribute("innerHTML"))
    
  • 注意:您必须添加以下导入:

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

参考文献

您可以在以下位置找到一些相关讨论:

【讨论】:

  • 嘿伙计们,我设法让脚本正常工作。我在这里使用了所有提到的选项/答案来提出另一个正在起作用的想法。感谢大家的大力帮助。
【解决方案2】:

参考您所附的图片,试试我写的下面的代码 -

mytxt = driver.find_element_by_xpath("(//g[@class='legend']/g[@class='legend-row'])[3]").text
Split_text = mytxt.split()

print(Split_text[1] + ' ' + Split_text[2])

输出 = 1.09 TB

注意 - 请使用索引号,即在我们的案例中 [3]。

【讨论】:

    【解决方案3】:

    彼得,如果您将所有三个值都作为文本/字符串获取,那么最简单的方法是

    string = "134.46Tb, 8.96TB, 1.09TB"
    third_item = string.split(',')[2]
    

    在 third_item 变量中,您将拥有 1.09TB

    另一种方式,您可以像这样在函数之后直接使用 split() -

    driver.find_element_by_class_name("legend-row").text.split(',')[2]
    

    split() 会将文本转换为以逗号分隔的字符串列表。我们可以使用切片获取特定项目。

    【讨论】:

    • 嘿@Indrajeet Singh 感谢您的建议。使用这条线UNALLOCATED_SPACE = driver.find_element_by_class_name("legend").text.split(',')[2] 我得到IndexError: list index out of range。使用拆分功能需要先导入吗?
    • 试试这个。 unallocatedSpace = driver.find_element_by_class_name("legend").text.split()[2]
    • 我在UNALLOCATED_SPACE = driver.find_element_by_class_name("legend").text.split()[5] 的这条线上得到了它,结果是1.09。我想知道为什么结核病被遗漏了?这对我来说有点重要,有什么猜测吗?
    • 你能把你得到的确切文本粘贴到 UNALLOCATED_SPACE 吗? ,所以我们可以看到它。因为我也从你在问题中提到的字符串中得到 TB
    • 嘿伙计们,我设法让脚本正常工作。我在这里使用了所有提到的选项/答案来提出另一个正在起作用的想法。感谢大家的大力帮助。
    猜你喜欢
    • 2023-03-05
    • 2022-11-10
    • 2020-01-15
    • 2021-10-20
    • 2014-09-08
    • 1970-01-01
    • 2019-07-18
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多