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 00:24:47 +08:00 · 2141 次点击
    这是一个创建于 2325 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看书看得懵圈了。。。

    要爬网页在单位的内部网里面,所以我贴出 url 大家也无法看到情况,直接摘抄修改了一下贴出来

    目标表格大概是这样的:

    <table id="outputtable1" class="tseb" width="100%" border="0" cellspacing="0" cellpadding="0">
    <tbody>
    <tr show="1" d="星期三" p="武汉" id="tr_109711" class="VputSection" t="2018-08-15 12:00"  >            
                <td class="pg1">
                    <a href="javascript:void(0);" id="v_1911"  class="bj"><code style="display:none">零件</code><i>310</i></a>
                    <s></s>
                </td>
    
                <td class="pg2" title="kingSize">
                    <span class="p_upi"><s></s>KS</span>
                </td>
    
                <td class="pg3">           
                    <span  title="下单时间:2018-08-15 9:30"  style="display:none">9:30</span>
                    <span  title="受理时间:2018-08-15 10:30"  style="display:none">10:30</span>
                </td>
    </tr>
    
    <tr show="1" d="星期三" p="天津" id="tr_109712" class="VputSection" t="2018-08-15 12:00"  >            
                <td class="pg1">
                    <a href="javascript:void(0);" id="v_1911"  class="bj"><code style="display:none">零件</code><i>311</i></a>
                    <s></s>
                </td>
    
                <td class="pg2" title="kingSize">
                    <span class="p_upi"><s></s>KS</span>
                </td>
    
                <td class="pg3">           
                    <span  title="下单时间:2018-08-15 9:32"  style="display:none">9:32</span>
                    <span  title="受理时间:2018-08-15 10:30"  style="display:none">10:30</span>
                </td>
    </tr>
    
    <tr show="1" d="星期三" p="南充" id="tr_109713" class="VputSection" t="2018-08-15 12:00"  >            
                <td class="pg1">
                    <a href="javascript:void(0);" id="v_1911"  class="bj"><code style="display:none">零件</code><i>312</i></a>
                    <s></s>
                </td>
    
                <td class="pg2" title="kingSize">
                    <span class="p_upi"><s></s>KS</span>
                </td>
    
                <td class="pg3">           
                    <span  title="下单时间:2018-08-15 9:37"  style="display:none">9:37</span>
                    <span  title="受理时间:2018-08-15 10:30"  style="display:none">10:30</span>
                </td>
    </tr>
    

    网页很简单,没太多的杂质,就表格 td > tr 而已,只想快速地使用 python 完成这个目标而不纠缠太多

    table 标签里的 table id,class,tr 标签里的 show,d,p,class,t 的属性很重要,每次不确定,需要根据这些内容来做另外的一些处理工作,

    现在只学到了 beautifulsoup,似乎 beautifulsoup 爬虫只能找到标签后,对标签首和标签闭合之间的内容做处理,而对标签里面的属性做不了处理?

    第一个问题:请问各位高手,我应该再去看什么文档或者库方法,可以既对标签属性进行套取,也可以对标签闭合直接(的内容)也处理呢?

    以下代码有部分是伪代码而且书写有错误,但应该能把事情表达清楚?

    #coding=UTF-8
    import requests
    from bs4 import BeautifulSoup
    import lxml
    
    #这个类省略,伪代码代替
    class adddata():
        def __init__():
        def write(...):
            #省略
        retrun xxx
    
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
    }
    url = 'http://10.11.12.1/QuerryForJsp.action?GoodId=179&type=ztcip22'
    page = requests.get(url,headers=headers)
    soup = BeautifulSoup(page.text, "lxml")
    
    #暂时储存独立变量,方便理解方式而已,以后会用 data[0],[1],[2]这样存储
    d=''
    p=''
    t=''
    
    i = 0
    
    for tr in soup.select('tr'):   
         #第二个问题:目标代码表格有三个 tr (不确定每次都是三个),如何做个循环历遍每个 tr,同时每个 tr 标签里的特定属性如何储存到上面三个变量中
        d = ???
        p = ???
        t = ???
     
        #第三个问题:如何判断当前 tr 标签里,有没有 t 属性? 属性很多,我裁剪了一些,有些目标属性有时候是不会出现的。。。
    
        #第四个问题,如何判断当前 tr 标签里,t 属性是不是空字符?例如:t = "",啥也没有。。。
        
        adddata.write(d,Data_d)
        adddata.write(p,Data_p)
        adddata.write(t,Data_t) 
        i = i + 1
        print('有',i,'项数据处理完毕')
    
    6 条回复    2018-08-16 18:41:07 +08:00
    WO31400
        1
    WO31400  
       2018-08-16 00:56:04 +08:00
    print(soup.find('tr').attrs['d']) #1.获取 tr 的属性值
    print(len(soup.find_all('tr'))) #2.1 获取所有的 tr 个数
    print(soup.find_all('tr')) #2.2 获取所有 tr 的内容
    b = soup.find('tr').attrs.get('t') #3 和 4 一起解决。 有 t 取值,没 t 返回 None
    print(b)
    Trim21
        2
    Trim21  
       2018-08-16 01:03:21 +08:00 via Android
    WO31400
        3
    WO31400  
       2018-08-16 01:05:14 +08:00
    for tr in soup.select('tr'):
    d = tr.attrs.get('d')
    p = tr.attrs.get('p')
    t = tr.attrs.get('t')
    if not t:
    print("t 是空字符")

    # 你所有的问题的都在代码里....
    ma6254
        4
    ma6254  
       2018-08-16 01:55:26 +08:00
    去查官方文档 ❌
    发帖等人解决 ✅
    mnssbe
        5
    mnssbe  
       2018-08-16 10:21:26 +08:00
    好消息 本站已经和百度达成战略合作 以后不用提问,直接上百度搜索就能解决问题
    pppguest3962
        6
    pppguest3962  
    OP
       2018-08-16 18:41:07 +08:00
    感谢楼上各位大大,特别感谢 @WO31400
    还是不太明白方法处理的关键点。。。。

    今天在测试爬表格,
    忽然发现有些表格中有嵌套表格的形式。。。。

    是这样的,我已经取得目标区域表格的代码,
    目标区域表格嵌套的,表格中有表格。。。

    ```
    #执行
    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]这个里面的<td class="width">标签里面,有两个内容,这种再嵌套的内容,如何读出来?

    ```
    <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>
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5317 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:25 · PVG 15:25 · LAX 23:25 · JFK 02:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.