V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qazwsxkevin
V2EX  ›  Python

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

  •  
  •   qazwsxkevin · 2020-02-07 17:42:26 +08:00 · 2511 次点击
    这是一个创建于 1756 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样的:

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

    4 条回复    2020-02-08 20:37:23 +08:00
    ClericPy
        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 选择器
    yangva
        2
    yangva  
       2020-02-07 23:14:50 +08:00 via Android
    xpath 可以实现,bs 不清楚
    Hieast
        3
    Hieast  
       2020-02-08 00:01:19 +08:00 via iPhone
    楼上说 xpath 可以实现,我记得 bs 是可以用 xpath 的,不妨详细看看?
    superrichman
        4
    superrichman  
       2020-02-08 20:37:23 +08:00
    tarGet.find_parent('div')
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3149 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:59 · PVG 21:59 · LAX 05:59 · JFK 08:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.