【问题标题】:Following Sibling not working in selenium python继兄弟姐妹不在 selenium python 中工作
【发布时间】:2021-06-03 21:17:45
【问题描述】:

我想要抓取的部分是这样的:

<dl class="some class">
    <dt> <strong>Text1</strong></dt>
    <dd> Result1</dd>
    <dt> <strong>Text2</strong></dt>
    <dd> Result2</dd>
    <dt> <strong>Text3</strong></dt>
    <dd> Result3</dd>
    <dt> <strong>Text4</strong></dt>
    <dd> Result4</dd>
    .  .  .

我目前在做的是:

e = driver.find_element_by_xpath("//*[contains(text(), 'Text3')]")

当我执行print(e.text) 时,它会成功打印Text3。我想要的是Result3。当我这样做时:

driver.find_element_by_xpath("//*[contains(text(), 'Text3')]/following-sibling::dd")

这显示了NoSuchElementException 的错误。我想要特定文本旁边的结果。

我也试过这个:

for i in driver.find_elements_by_class_name("some class"):
    print(i.find_element_by_xpath("./dt[.='Text3']/following-sibling::dd").text)

仍然显示NoSuchElementException

【问题讨论】:

    标签: python selenium selenium-webdriver xpath


    【解决方案1】:

    尝试使用以下代码获取国家/地区名称。

    parent=driver.find_element_by_css_selector("dl.BuyingOptions-labeledValues")
    country=parent.find_element_by_xpath("./dt[contains(.,'Country Of Origin')]/following::dd[1]")
    print(country.text)
    

    country=driver.find_element_by_xpath("//dl[contains(@class,'BuyingOptions-labeledValues')]//dt[contains(.,'Country Of Origin')]/following::dd[1]")
    print(country.text)
    

    打印:

    Switzerland
    

    【讨论】:

    • 它仍然无法正常工作。给出相同的NoSuchElementException。如果我打印 i.text 它会成功打印所有表格元素。如果我这样做: print(i.find_element_by_xpath("./dt[contains(.,'Text3')]").text) 它仍然显示相同的错误
    • 你的some class是两个不同的类名还是只有一个类?
    • 一个类名。实际的类看起来像这样:&lt;dl class = "BuyingOptions-labeledValues BuyingOptions-labeledValues--aligned BuyingOptions-labeledValues--indented u-tablet-up-showFlex"&gt; ...&lt;/dl&gt; 我只是在按类名查找元素中使用第一个“BuyingOptions-labeledValues”
    • 如果对你有帮助的话,我也可以给你原始网站的链接
    • 可以发链接吗?
    【解决方案2】:

    文本Text3 不在&lt;dt&gt; 标记中,而是在其子&lt;strong&gt; 标记中。 element.text 为您提供正确的文本,因为 element.text 返回元素中的所有文本及其后代,但对于 xpath 来说还不够好。

    您需要获得&lt;dt&gt;,它有一个带有文本Text3 的子元素。注意following-sibling返回后面所有的兄弟,所以需要用索引1指向第一个兄弟

    //dt[strong[contains(text(), 'Text3')]]/following-sibling::dd[1]
    

    【讨论】:

      【解决方案3】:

      我浏览了所有评论,无论是他们推荐索引还是定位器中的直接文本。 在定位器中使用文本实际上并不是一个好主意,因为如果发生任何故障,它不会为您提供元素中存在的预期和实际文本。 因此,请始终尝试将值存储在所有子节点的密钥对节点中,然后访问所需的。

       List<WebElement> el = driver.findElements(By.cssLocator(".some.class *"))
       Map<String,String> dlItems = new HashMap<String,String>();
      for(int i=0;i<=el.length()/2+1;i+2){
          dlItems.put(el.get(i).getText(),el.get(i+1).getText());
      }
      

      循环条件取决于需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        • 2014-07-12
        • 2015-03-06
        • 2019-05-06
        • 2019-08-29
        • 2014-03-30
        • 1970-01-01
        相关资源
        最近更新 更多