【问题标题】:Unable to select html element by class name in python selenium无法在 python selenium 中按类名选择 html 元素
【发布时间】:2018-06-01 11:24:10
【问题描述】:

我正在尝试从以下 html 代码的最后一行中选择 I NEED THIS TEXT,但目前尚未成功:

        <div class="warn">
<div class="row container pv2">
    <div class="col xs12">
        <div class="display-table-cell b-text_copy-4 pr1">
            <i class="msg-icon b-icon b-icon-warn"></i>
        </div>
        <div class="display-table-cell b-text_copy-2 b-text_weight-bold">
                    <div> I NEED THIS TEXT <a href=https://somelink/contact.html target=_blank>contact us</a>.</div>

INPUT我使用以下方法失败了:

# all lines also tested without .text suffix
    text1 = driver.find_element_by_class_name("display-table-cell.b-text_copy-2.
                                              b-text_weight-bold").text
    text2 = driver.find_element_by_class_name("warn").text 
    text3 = driver.find_element_by_class_name("col.xs12").text
    text4 = driver.find_element_by_class_name("display-table-cell").text
    text5 = driver.find_element_by_xpath("//*[contains(@text='I NEED THIS TEXT')]")

输出

text1: Message: Unable to locate element: .display-table-cell.b-text_copy-2.b-text_weight-bold
text2: Message: Unable to locate element: .warn
text3: Message: Unable to locate element: .col.xs12
text4: Message: Unable to locate element: .display-table-cell
text5: Message: Given xpath expression "//*[contains(@text='I NEED THIS TEXT')]" is invalid: [Exception... "<no message>"  nsresult: "0x8060000d (<unknown>)"  location: "JS frame :: chrome://marionette/content/element.js :: element.findByXPath :: line 355"  data: no]

我做错了什么吗?如何选择我需要此文本并将其打印到控制台?

【问题讨论】:

    标签: python selenium html-content-extraction


    【解决方案1】:

    主要问题是您主要使用 CSS 选择器而不是类名。 .find_element_by_class_name() 专门用于单个类名。如果你想使用 CSS 选择器,你需要使用.find_element_by_css_selector()。您使用的大多数 CSS 选择器实际上也不是您想要的 DIV。没有指向页面的链接或更多 HTML 很难判断,但请尝试这些。

    CSS 选择器

    div.display-table-cell.b-text_copy-2.b-text_weight-bold > div
    

    XPath

    //div[contains(.,'I NEED THIS TEXT')]
    //a[.='contact us']/..
    

    您将遇到的一个问题是,立即包含您想要的文本的DIV 还包含“联系我们”。因此,如果您不希望将其作为最终字符串的一部分,则需要将其删除。

    【讨论】:

    • 你说得对 - 你介意我通过电子邮件与你联系吗?
    • 您谈到了 OP 已经尝试过但失败的事情。您的回答不包含任何拆分逻辑来提取 OP 需要的文本。
    • @DebanjanB 是的......我相信这是一个好的答案的核心。解释为什么 OP 的尝试失败了,这样他们就可以了解他们做错了什么。一个好的答案的另一个关键部分是实际回答问题。我也通过提供 3 种不同的方法来做到这一点。我解决了有关打印的额外文本的部分,但 OP 没有说明他们是否关心该文本是否在其中,所以我描述了如何自己修复它,这在网络上的许多其他问题、博客和教程中都有所涉及,所以这留给 OP 来解决。
    • @DebanjanB 你在做什么被称为报复性投票。你对我投了反对票,因为我对你投了反对票。我注意到你以前这样做过,你需要停下来。我出于正当理由对您的回答投了反对票,并在我的评论中解释了原因。如果你能证明我错了,我会推翻我的反对意见。您对我的回答的评论没有内容。您会注意到 OP 同意我的观点,并且没有对我的答案的更正发表评论。阅读:meta.stackexchange.com/questions/106704/….
    • @sudonym 我不会泄露我的个人电子邮件。您可以将 cmets 留在这里,我会看到他们并通常会做出回应。
    【解决方案2】:

    我们的主要目标是从以下节点中提取文本 I NEED THIS TEXT

    <div> I NEED THIS TEXT <a href=https://somelink/contact.html target=_blank>contact us</a>.</div>
    

    现在根据您的代码试验,您尝试使用class_name display-table-cell.b-text_copy-2.b-text_weight-boldwarncol.xs12 , display-table-cellxpath//*[contains(@text='I NEED THIS TEXT')]。通过那些class_name,您还没有到达包含预期文本的确切Node。因此我们必须构造一个 xpath 或一个 cssSelector 来模拟 DOM 并达到预期的&lt;div&gt;文本所在的标签。

    因此,要从给定 html 的最后一行打印 I NEED THIS TEXT 到控制台,您可以使用以下代码块:

    my_string = driver.find_element_by_xpath("//div[ancestor::div[contains(@class, 'display-table-cell b-text_copy-2 b-text_weight-bold')]]").get_attribute("innerHTML")                    
    my_text = my_string.split("contact")
    print(my_text[0])
    

    控制台输出:

    I NEED THIS TEXT 
    

    【讨论】:

    • 返回错误:消息:给定 xpath 表达式 "//div[@class='display-table-cell b-text_copy-2 b-text_weight-bold']/[(self::div)而不是(@href='somelink/contact.html')]" 无效:SyntaxError: The expression is not a legal expression.
    • 为什么要使用innerHTML?您将收到“我需要此文本somelink/contact.htmltarget=_blank>联系我们。”。
    • @sudonym 查看我更新的答案,让我知道状态。
    • @JeffC 我认为您对使用get_attributeinnerHTML 感到非常困惑和犹豫。请仔细阅读文档,如果您有任何问题,请告诉我。
    • 我完全理解它将做什么......这就是我在评论中打印它的原因。我错了吗?如果是这样,输出应该是什么?你似乎是一个困惑的人。这显然是你改变答案的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多