通过包含文本获取元素名称

Get element name by containing text

我正在 HTML 文档中查找文本:"Required"。我需要找到的是保存文本的元素。例如:

<p>... Required<p>

我会得到元素名称 = p

但是,它可能不在 <p> 标签中。它可以在任何类型的标签中,这是这个问题与其他一些搜索文本 Stack Overflow 问题不同的地方。

现在我正在使用:

page.at(':contains("Required")')

但这只会让我得到完整的 HTML 元素

您应该使用 CSS 选择器:

page.css('p').text

您遇到的问题是 :contains 伪 class 匹配在其后代的任何位置搜索到文本的任何元素。您需要找到包含此类文本的最内层元素。由于 html 是所有元素的祖先,如果页面包含任何地方的文本,那么 html 将包含,因此这将是第一个匹配元素。

我不确定您是否可以使用 CSS 实现此目的,但您可以像这样使用 XPath:

page.at_xpath('//*[text()[contains(., "Required")]]')

这将找到具有 text() 节点作为包含 Required 的子节点的第一个元素节点。当您拥有该节点(如果它存在)时,您可以在其上调用 name 以提供元素的名称。

对于 CSS 你可以这样做:

page.at('[text()*="Required"]')

虽然这不是真的 CSS,甚至是 jQuery 额外的。