【问题标题】:Retrieve the text node that is not part of <a> with XPATH, python selenium?使用XPATH,python selenium检索不属于<a>的文本节点?
【发布时间】:2019-09-13 16:40:41
【问题描述】:

在以下链接上:https://classicdb.ch/?quest=788

这里是//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td 它包含一个文本

杂色野猪 消灭 (10)

//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td/a

仅包含:

杂色野猪

我只需要包含以下内容的第二部分:

被杀 (10)

在带有 selenium 的 python 中,我尝试使用以下命令直接访问节点:

//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td/text()

但是 webdriver 只能包含 webelements 而不能包含文本节点。

xpath 表达式的结果 "//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td/a/following-sibling::text()" 是:[对象文本]。它应该是一个元素。

我也试过了:

//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td/a/following-sibling::text()

但确实返回相同的错误,它应该是一个元素而不是对象文本。

我找到了一种解决方法,首先只选择文本,然后从整个文本中减去它——但这很难看。 如何正确实现这一目标?

谢谢!

编辑:我不能在代码中使用特定变量,例如“slain”或“Mottled Boar”,因为这些变量在其他情况下可能会发生变化。

【问题讨论】:

    标签: python html python-3.x selenium xpath


    【解决方案1】:

    试试这个 xpath。

    //table[@class='iconlist']//tr//td[contains(.,'slain')]//a[contains(.,'Mottled Boar')]
    

    编辑

    //table[@class='iconlist']//tr//td//a
    

    使用 javaScript 执行器。其中firstChild 将返回Mottled BoarlastChild 将返回 slain (10)

    driver.get("https://classicdb.ch/?quest=788")
    print(driver.execute_script('return arguments[0].lastChild.textContent;', driver.find_element_by_xpath("//table[@class='iconlist']//tr//td[1]")))
    print(driver.execute_script('return arguments[0].firstChild.textContent;', driver.find_element_by_xpath("//table[@class='iconlist']//tr//td[1]")))
    

    【讨论】:

    • 对不起,我不能在代码中使用特定的变量,比如 'slain' 或 'Mottled Boar' 编辑:因为这些变量是可以改变的。 edit2:我会在我的问题中添加这个条件
    • 这只有第一部分斑驳野猪 - 我需要另一部分,上面写着“slain (10)”
    • @masky007 :要获得slain (10),您需要使用javascript执行器返回最后一个节点值。
    • @masky007 : 最后一个孩子将返回slain (10),第一个孩子将返回Mottled Boar 告诉我进展如何。
    • 是的,谢谢! - 你只能在答案中留下最后一部分,因为它回答了我在哪里可以了解更多关于这个问题的问题 - 虽然我以前从未使用过 Java。
    【解决方案2】:

    你的 xpath 是正确的。您可以尝试这种方法直接从该节点获取文本。您将需要 lxml 导入。

    from lxml import html
    
    tree = html.fromstring(driver.page_source)
    myText = tree.xpath("//*[@id='main-contents']/div[1]/table[1]/tbody/tr/td/a/following-sibling::text()")
    
    print(str(myText).replace('\\t', ''))
    

    【讨论】:

      猜你喜欢
      • 2018-07-20
      • 2020-10-08
      • 1970-01-01
      • 2019-04-23
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多