>我正在尝试从以下 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>
输入我使用以下方法失败了:
# 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]
我做错了什么根本性的事情吗?如何选择我需要此文本并将其打印到控制台?
主要问题是你主要使用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
也包含" 联系我们",因此,如果您不希望将其作为最终字符串的一部分,则需要将其删除。
我们的主要目的是从以下节点中提取文本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-bold
,warn
,col.xs12
,display-table-cell
和xpath
作为//*[contains(@text='I NEED THIS TEXT')]
。通过这些class_name
您还没有到达包含预期文本的确切Node
。因此,我们必须构建一个xpath
或cssSelector
来模拟DOM
并到达文本所在的预期<div>
标签。
因此,要将I NEED THIS TEXT
从给定 html 的最后一行打印到控制台,您可以使用以下代码块:
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