python - 获取包含特定文本的标记的 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”,但最终对于更复杂的页面,我还需要获取标签属性
谢谢!
解决方案
如果你知道你想要的标签总是会有“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
推荐阅读
- django - 在 Django 项目中设置 Reactjs
- java - 如何使 TestRestTemplate 忽略重定向
- javascript - 如何使用时刻 js 获得 24 小时时间
- python-3.x - mpi4py 收不到消息
- c# - '=' 附近的语法不正确。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常
- android - 无法映射视图组子项
- android - 如何获取我使用下载管理器下载的文件的 URI?
- java - 将 MM/DD/YYYY 转换为子字符串
- python - 返回一个负值
- ecmascript-6 - 使用 webpack-dev-server 实时将 ES6+ 转换为 ES5