如何在XPath中使用contains()函数?

3

我正在尝试从一个网页中收集信息,但无法获取正确的XPath来查找它。以下是来自网站的一段内容:

<div class="posted">
  <div>
    June 20, 2018
  </div>
</div>

我想搜索每个页面,查找带有“posted”类的元素,然后将其下方的所有内容作为字符串返回。(字符串可以有杂乱无章的格式;我将使用“if "2018" in "possibleDate"”来搜索年份)这是我的尝试代码:
possibleDate = str(tree.xpath("//div[contains(@class, ’posted’)]//@text"))

它说这是一个无效的表达式。
我哪里做错了吗?


请注意,[contains(@class, 'posted')] 不是错误的,但我怀疑你想要的是 [@class = 'posted']。 "contains" 版本将匹配 @class="signposted";而 "=" 版本则不会。 - Michael Kay
1个回答

1
首先,用 ' 字符替换 posted 周围的 字符。
其次,用 text() 替换 @text 以消除 XPath 语法错误。
此外,您可能希望使用所选 div 的空格规范化字符串值,而不是选择文本节点:
possibleDate = str(tree.xpath("normalize-space(//div[@class='posted'])")

这将抽象出目标
内嵌的标记变化。
另请参阅:{{link1:xpath:查找类属性匹配某个值且文本包含特定字符串的节点}}

@text替换为text()仍然会返回无效表达式错误。使用possibleDate = str(tree.xpath("normalize-space(//div[@class='posted'])"))没有出现错误,但也没有找到任何内容。 - George Sonancia
啊,你还需要在XPath中用'字符替换posted周围的字符。回答已更新。 - kjhughes
谢谢。我已经测试过 tree.xpath("//div[contains(@class, 'posted')]//text()")tree.xpath("normalize-space(//div[@class='posted'])")tree.xpath("//div[contains(@class, 'posted')]"),但它们都只返回空字符串。我确定这些页面中包含了适当的类,但它们仍然找不到它们。 - George Sonancia
你需要在问题中更新一个真实的 ***[mcve]***,这样我们才能更进一步地帮助你。 - kjhughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接