当表格列中有文本可用时,为什么我会得到无?

时间:2013-05-28 08:48:41

标签: python html web-scraping html-parsing beautifulsoup

我正在使用Beautiful Soup进行网页编写。我是新手。

问题1: 这是表:

<table width="75%" align=center>
    <tr>
        <td><STRONG><font face="Arial" size=2>S.No:</font></STRONG></td>
        <td><font face="Arial" size=2> 1635925</font></td>
    </tr>
    <tr>
        <td><FONT size=2><STRONG><font face="Arial">Name:</font><br></STRONG></FONT></td>
        <td><font face="Arial" size=2> <b>Alex</b></font></td>
    </tr>
    <tr>
        <td><STRONG><font face="Arial" size=2>Dog's Name:</font></STRONG></td>
        <td><font face="Arial" size=2> Tiger</font></td>
    </tr>
    <tr>
        <td><STRONG><font face="Arial" size=2 >Cat's Name:</font></STRONG></td>
        <td><font face="Arial" size=2>Pussy</font></td>
    </tr>
</table>

以下是参考上表的代码:

for row in soup('table')[4]('tr'):
  tds = row('td')
  print tds[0].string, tds[1].string

这是输出:

S.No:  1635925
None None
Dog's Name:  Tiger
Cat's Name: Pussy

问题是第2行,为什么两列打印None

问题2:与上述类似的问题

  <tr bgcolor="#ffffff">
    <td align="middle"><font face="Arial" size=2>503</font></td>
    <td align="left"><font face="Arial" size=2>Text1</font></td>
    <td align="left"><font face="Arial" size=2>---</font></td>
    <td align="middle"><font face="Arial" size=2>2</font></td>
  </tr>  

   <tr bgcolor="#e6e6fa">
          <td colspan=4><font face="Arial" size=2>&nbsp;&nbsp;some random text</font></td>
   </tr>
   <tr >
    <td align="middle"><font face="Arial" size=2>048</font> </td>
    <td align="left"><font face="Arial" size=2>Text 2</font></td>
    <td align="left"><font face="Arial" size=2>187 &nbsp;&nbsp;&nbsp;&nbsp;</font></td>
    <td align="middle"><font face="Arial" size=2>2</font></td>
  </tr>

我的代码:

for row in soup('table')[5]('tr'):
    tds = row('td');
    if len(tds) == 4:
        print tds[0].string, tds[1].string, tds[2].string, tds[3].string

输出:

503 Text1 --- 2
None Text2 187     2

为什么第一列的文字None而不是048

2 个答案:

答案 0 :(得分:1)

尝试text代替string。 E.g:

for row in soup('table')[4]('tr'):
  tds = row('td')
  print tds[0].text, tds[1].text

打印:

S.No:  1635925
Name:  Alex
Dog's Name:  Tiger
Cat's Name: Pussy

根据docs,如果元素有多个子元素,则string变为None

  

为方便起见,如果标记只有一个子节点和该子节点   node是一个字符串,子节点可用作tag.string,如   以及tag.contents [0]。

答案 1 :(得分:1)

问题是第二行的td元素不包含带字符串内容的单个元素;它们包含两个。因此,string没有明确的值,因此会返回None

如果你把它分解成碎片,你可以看到这个:

>>> table = s('table')[4]
>>> row = table('tr')[1]
>>> col = row('td')[0]
>>> font = col('font')[0]
>>> strong = font('strong')[0]
>>> font2 = strong('font')[0]
>>> strong
<strong><font face="Arial">Name:</font><br/></strong>
>>> strong.string
>>> font2
<font face="Arial">Name:</font>
>>> font2.string
u'Name:'

如果您想要元素中所有字符串的文字表示,请使用text代替string

>>> strong.text
u'Name:'
>>> font.text
u'Name:'
>>> col.text
u'Name:'