我正在尝试从具有不同xpath的元素访问文本,但该元素在Web数据库的多个页面上具有非常可预测的href方案。以下是一些示例:
<a href="/mathscinet/search/mscdoc.html?code=65J22,(35R30,47A52,65J20,65R30,90C30)">
65J22 (35R30 47A52 65J20 65R30 90C30) </a>
在此示例中,我要提取“ 65J22(35R30 47A52 65J20 65R30 90C30)”
<a href="/mathscinet/search/mscdoc.html?code=05C80,(05C15)">
05C80 (05C15) </a>
在此示例中,我想提取“ 05C80(05C15)”。由于所需元素在页面之间变化,因此我的网页抓取工具无法直接通过xpath进行搜索,因此我正在寻找一种更round回的方法。
我的主要想法是利用每个href都包含“ /mathscinet/search/mscdoc.html?code=“的事实。 Selenium无法直接搜索href,但是我正在考虑做与此类似的C# implementation:
Driver.Instance.FindElement(By.XPath("//a[contains(@href, 'long')]"))
要将其移植到python上,我唯一想到的类似方法是使用in
operator,但是我不确定当所有内容都嵌套在find_element_by_xpath中时该语法如何工作。我如何将所有这些想法融合在一起以获得所需的文本?
driver.find_element_by_xpath("//a['/mathscinet/search/mscdoc.html?code=' in @href]").text
答案 0 :(得分:3)
如果我理解正确,您想找到所有具有相同部分href的元素。您可以使用:
elements = driver.find_elements_by_xpath("//a[contains(@href, '/mathscinet/search/mscdoc.html')]")
for element in elements:
print(element.text)
或者如果您要查找一个元素:
driver.find_element_by_xpath("//a[contains(@href, '/mathscinet/search/mscdoc.html')]").text
这将列出所有已找到的元素。
答案 1 :(得分:1)
根据 HTML ,您已经分享了@AndreiSuvorkov的答案,可能会满足您当前的要求。也许您可以通过以下方式获得更多粒度并构建优化的 xpath :
contains
starts-with
?code=
属性中包含 @href
部分您的有效代码块将是:
all_elements = driver.find_elements_by_xpath("//a[starts-with(@href,'/mathscinet/search/mscdoc.html?code=')]")
for elem in all_elements:
print(elem.get_attribute("innerHTML"))