无法在python selenium中按类名选择html元素

问题描述 投票:-1回答:2

我试图从下面的html代码的最后一行选择我需要这个文本,到目前为止还没有成功:

        <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')]")

OUTPUT:

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
2个回答
-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也包含“与我们联系”。因此,如果您不希望将其作为最终字符串的一部分,则需要将其删除。


-1
投票

我们的主要目标是从以下节点中提取文本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.xs12display-table-cellxpath作为//*[contains(@text='I NEED THIS TEXT')]。通过那些class_name你没有达到包含预期文本的确切Node。因此,我们必须构建一个xpathcssSelector来模拟DOM并到达文本所在的预期<div>标签。

因此,要从给定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 
© www.soinside.com 2019 - 2024. All rights reserved.