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
pppguest3962
V2EX  ›  Python

请问 BeautifulSoup 在处理处理嵌套表格的问题。。。

  •  
  •   pppguest3962 · 2018-08-16 20:36:36 +08:00 · 1808 次点击
    这是一个创建于 2051 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天在测试爬表格, 忽然发现有些表格中有嵌套表格的形式。。。。 没使用 xpath,主要是因为路径节点的名称会变化,而不是永久固定的,不好把握,但表格就一直相对固定的。。。

    是这样的,我已经取得目标区域表格的代码, 目标区域表格嵌套的,表格中有表格?(有 td 标签)

    #执行
    targettable = soup.select('tr > td')
    
    print (targettable[0])
    #targettable 有好多个(行),先把第一行的表格处理吧,
    

    输出:

    <td class="pagket">
    <a class="ah" href="javascript:void(0);" id="p_109746"><code style="display:none">物件</code><i>77239</i></a>
    </td>
    
    <td class="pagketname" title="model16">
    <a href="http://10.11.12.1/gooddata/1733356.html" target="_blank"><span class="2016"><s></s>蔡杰</span></a>
    </td>
    
    <td class="width">
    <span id="w_19281" title="宽度">349</span>
    <span style="display:none" title="录入时间:2016-03-11 12:30">12:30</span>
    <span style="display:none" title="审核时间:2016-03-11 14:21">14:21</span>
    </td>
    
    <td class="weight">
    <span id="wt_19281" title="重量">349</span>
    </td>
    
    <td class="conductor">
    <em class="pm ">处理人
    <i title="物件处理人">陈才华</i>
    </em>
    <a href="http://10.11.12.1/staff/41.html" target="_blank" title="联系人">陈才华</a>
    </td>
    

    第一个问题:在输出的第一行,是'td class'这种标签属性,应该如何从 targettable[0]中获取其内容? 我这样做是不行的,望请高手指点迷津...

    print(targettable[0].find('td').attrs['class']))
    print(targettable[0].find('td').attrs['td class']))
    

    也试过这样:

    for tr in soup.select('tr > td'):
    targettr = BeautifulSoup(tr.text, "lxml")
    #然后想对 targettr 做些什么,好像这条路做不通?
    

    第二个问题:

    <td class="pagketname" title="model16">
    

    读出 title 内容?

    第三个问题:在 targettable[0]这个里面的标签里面,有两个内容,这种再嵌套的内容,如何读出来?

    <span style="display:none" title="录入时间:2016-03-11 12:30">12:30</span>
    <span style="display:none" title="审核时间:2016-03-11 14:21">14:21</span>
    
    1 条回复    2018-08-17 11:57:44 +08:00
    bmos
        1
    bmos  
       2018-08-17 11:57:44 +08:00
    我自己试了一下。
    text = """上述输出"""
    soup = BeautifulSoup(text,"lxml")

    soup.find("td").attrs['class']#这个做法应该和你的一样
    Out[157]: ['pagket']

    soup.find("td",{"class","pagketname"}).attrs['title']#和第一个问题一样吧
    Out[159]: 'model16'

    a = soup.find_all("span",{"style":"display:none"})#第三个问题

    a[0].attrs['title']
    Out[161]: '录入时间:2016-03-11 12:30'

    a[0].get_text()
    Out[162]: '12:30'
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   966 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:47 · PVG 04:47 · LAX 13:47 · JFK 16:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.