(BeautifulSoup)请问,根据已知定位子标签,再次定位有特征的未知 N 层父、祖标签的方法?

2020-02-07 17:42:26 +08:00
 qazwsxkevin

是这样的:

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 本身有无可能,直接做到以上两种情况的直接定位? 或者更好的定位思路?

2427 次点击
所在节点    Python
4 条回复
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 选择器
yangva
2020-02-07 23:14:50 +08:00
xpath 可以实现,bs 不清楚
Hieast
2020-02-08 00:01:19 +08:00
楼上说 xpath 可以实现,我记得 bs 是可以用 xpath 的,不妨详细看看?
superrichman
2020-02-08 20:37:23 +08:00
tarGet.find_parent('div')

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/642813

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX