Python爬虫中如何分析标签属性本身?BeautifulSoup无法做到吗?

看书看得懵圈了。。。

要爬网页在单位的内部网里面,所以我贴出 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>
        &lt;td class="pg2" title="kingSize"&gt;
            &lt;span class="p_upi"&gt;&lt;s&gt;&lt;/s&gt;KS&lt;/span&gt;
        &lt;/td&gt;

        &lt;td class="pg3"&gt;           
            &lt;span  title="下单时间:2018-08-15 9:30"  style="display:none"&gt;9:30&lt;/span&gt;
            &lt;span  title="受理时间:2018-08-15 10:30"  style="display:none"&gt;10:30&lt;/span&gt;
        &lt;/td&gt;

</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>

        &lt;td class="pg2" title="kingSize"&gt;
            &lt;span class="p_upi"&gt;&lt;s&gt;&lt;/s&gt;KS&lt;/span&gt;
        &lt;/td&gt;

        &lt;td class="pg3"&gt;           
            &lt;span  title="下单时间:2018-08-15 9:32"  style="display:none"&gt;9:32&lt;/span&gt;
            &lt;span  title="受理时间:2018-08-15 10:30"  style="display:none"&gt;10:30&lt;/span&gt;
        &lt;/td&gt;

</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>

        &lt;td class="pg2" title="kingSize"&gt;
            &lt;span class="p_upi"&gt;&lt;s&gt;&lt;/s&gt;KS&lt;/span&gt;
        &lt;/td&gt;

        &lt;td class="pg3"&gt;           
            &lt;span  title="下单时间:2018-08-15 9:37"  style="display:none"&gt;9:37&lt;/span&gt;
            &lt;span  title="受理时间:2018-08-15 10:30"  style="display:none"&gt;10:30&lt;/span&gt;
        &lt;/td&gt;

</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,'项数据处理完毕')


Python爬虫中如何分析标签属性本身?BeautifulSoup无法做到吗?

6 回复

帖子回复:

直接说结论:BeautifulSoup当然能分析标签属性,而且这是它的核心功能之一。你可能是被某些教程误导了,或者没找对方法。

属性分析主要用这几种方式:

  1. 直接获取属性值:用tag['属性名'],比如soup.find('a')['href']获取链接。
  2. 获取所有属性:用tag.attrs,返回一个字典,包含该标签的所有属性和值。
  3. 检查属性是否存在:用tag.has_attr('属性名'),返回True或False。
  4. 多值属性处理:像class这种可能有多个值的属性,BeautifulSoup会自动处理为列表。

给你个完整例子,一看就懂:

from bs4 import BeautifulSoup

html = '''
<div id="main" class="container active" data-info="test">
    <a href="https://example.com" class="link" target="_blank">链接</a>
    <img src="image.jpg" alt="示例图片">
</div>
'''

soup = BeautifulSoup(html, 'html.parser')
div_tag = soup.find('div')
a_tag = soup.find('a')

# 1. 获取单个属性
print("ID:", div_tag['id'])  # 输出: main
print("Href:", a_tag['href'])  # 输出: https://example.com

# 2. 获取所有属性
print("所有属性:", div_tag.attrs)  
# 输出: {'id': 'main', 'class': ['container', 'active'], 'data-info': 'test'}

# 3. 检查属性是否存在
print("是否有class属性:", div_tag.has_attr('class'))  # 输出: True
print("是否有style属性:", div_tag.has_attr('style'))  # 输出: False

# 4. 处理多值属性(如class)
print("Class列表:", div_tag['class'])  # 输出: ['container', 'active']
print("是否包含'active':", 'active' in div_tag['class'])  # 输出: True

# 5. 安全获取(避免KeyError)
img_tag = soup.find('img')
alt_text = img_tag.get('alt', '默认文本')  # 如果alt不存在,返回'默认文本'
print("Alt文本:", alt_text)  # 输出: 示例图片

# 6. 遍历所有属性
for attr_name, attr_value in a_tag.attrs.items():
    print(f"{attr_name}: {attr_value}")
# 输出:
# href: https://example.com
# class: ['link']
# target: _blank

常见坑点:

  • 属性不存在时直接tag['属性']会抛KeyError,用tag.get('属性', 默认值)更安全
  • class属性比较特殊,BeautifulSoup会智能处理成列表
  • 自定义属性(如data-*)和标准属性访问方式完全一样

总结: BeautifulSoup处理属性很直接,用对方法就行。


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 是空字符”)

# 你所有的问题的都在代码里…

去查官方文档 ❌
发帖等人解决 ✅

好消息 本站已经和百度达成战略合作 以后不用提问,直接上百度搜索就能解决问题

感谢楼上各位大大,特别感谢
还是不太明白方法处理的关键点。。。。

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

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

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


输出:

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


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

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

也试过这样:

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

第二个问题:
<br>&lt;td class="pagketname" title="model16"&gt;<br>
读出 title 内容?



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

<br>&lt;span style="display:none" title="录入时间:2016-03-11 12:30"&gt;12:30&lt;/span&gt;<br>&lt;span style="display:none" title="审核时间:2016-03-11 14:21"&gt;14:21&lt;/span&gt;<br>

回到顶部