是这样的:
A
|
B('table',{'class':'super'})
|
C
|
D('table',{'class':'super'})
|
E
|
F (div,{'id':'tt'})
xxx
xxx
xxx
|
Z
|
</Z>
|
</Y>
|
</X>
实际最终需求是:获得目标('table',{'class':'super'}),返回 BeautifulSoup 类型 实际情况是:('table',{'class':'super'})在整个页面里也太多了
第 1 个问题:因为 F 的特征明显(页内唯一,而且必定在想要的目标('table',{'class':'super'})之下),F 容易做到绝对定位, 目前已经返回了 BeautifulSoup 类型->tarGet 举例为:
tarGet = BeautifulSoup(htmlPageString,'lxml').find(div,{'class':'tt'})
现在如何根据 tarGet 的定位,向上追到最近的('table',{'class':'super'})
第 2 个问题: 同上,上追到最近的('table',{'class':'super'}),在同级的标签里,找另外一个('table',{'class':'holyhigh'})
以上两个问题的解决方式,我也可以通过一个一个环节的 for 循环,去 if BeautifulSoup.parent 做判断,再最终获得目标 BeautifulSoup 类型的。。。
但是如果 htmlPageString 样本量大,加上读取网页文件( I/O ),python 本来就不快(相对而言),if 又 10 几个+flag 判断,那么历遍完,耗时就很可观。
BeautifulSoup 本身有无可能,直接做到以上两种情况的直接定位? 或者更好的定位思路?
1
ClericPy 2020-02-07 18:15:15 +08:00
之前查过这方面的, 受 DOM 还是什么的结构限制, CSS 之类的东西都不能做这种找到"拥有某子节点的父节点"一类的回溯功能
我在前端用的就是你说的 for 循环的方法, 在每个 innerHTML 里正则或者二次 query https://stackoverflow.com/questions/2000582/css-selector-for-foo-that-contains-bar 至于 beautifulsoup... 我用 bs4 99% 的时间都在用 css 选择器 |
2
yangva 2020-02-07 23:14:50 +08:00 via Android
xpath 可以实现,bs 不清楚
|
3
Hieast 2020-02-08 00:01:19 +08:00 via iPhone
楼上说 xpath 可以实现,我记得 bs 是可以用 xpath 的,不妨详细看看?
|
4
superrichman 2020-02-08 20:37:23 +08:00
tarGet.find_parent('div')
|