首页 > 解决方案 > 获取包含特定文本的标记的 xpath

问题描述

我正在尝试查找网页上某些文本的 xpath。如果您要去https://www.york.ac.uk/teaching/cws/wws/webpage1.html并尝试获取“EXERCISE”的 xpath,它看起来像“html body html table tbody tr td div h4"。如果您转到该页面,右键单击“EXERCISE”并检查它,您可以在代码底部看到路径(在 chrome 中)。

我尝试了许多路径。这些都没有得到预期的结果。这是我得到的最接近的:

soup = BS(page, 'html.parser')
tags = [{"name":tag.name,"text":tag.text,"attributes":tag.attributes} for tag in soup.find_all()]
s = ''
for t in tags:
    if "EXERCISE" in t['text']:
        s = s + t['name'] + " "
print(s)

一开始我需要获取“html body html table tbody tr td div h4”,但最终对于更复杂的页面,我还需要获取标签属性

谢谢!

标签: pythonxpathbeautifulsoup

解决方案


如果你知道你想要的标签总是会有“EXERCISE”的确切文本(没有引号,或者后面的不同情况,空格等),那么你可以.find在确切的文本上使用 a 。尽管您也可以使用正则表达式来代替,以防您确实想检查空格变化等等。

从那里,您可以利用.parents获取对象祖先的列表,即包含它的元素、包含该元素的元素等等,直到文档的顶部。然后只需提取标签名称,反转列表,然后将所有内容连接在一起。

thetag = soup.find(string="EXERCISE")
parent_tags = [ p.name for p in list(thetag.parents) ]
print('/'.join(parent_tags[::-1]))

输出:

[文档]/html/body/hmtl/table/tr/td/div/h4

如果您不想[document]在一开始就使用“”,则可以通过多种方式将其取出,例如使用这些行而不是最后两行:

parent_tags = [ p.name for p in list(thetag.parents)[:-1] ]
print('/' + '/'.join(parent_tags[::-1]))

输出:

/html/body/hmtl/table/tr/td/div/h4


推荐阅读