2013-05-28 20 views
1

我正在使用美麗的湯做webscraping。我是新手。當表格列中有文字時,爲什麼我會得到None?

問題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

+1

值得注意的是,您正在嘗試處理的HTML是一團糟,將HTML3中棄用HTML2的HTML2功能與3或4中添加的功能混合在一起。如果你正在學習'BeautifulSoup',那麼從解析一個有效的HTML4頁面開始,可能會容易得多,並且只有在你理解了更好的東西后才試圖學習如何處理可怕的HTML。 – abarnert

回答

1

試試看text而不是string。例如:

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 

docsstring成爲None如果元素有多個兒童:

爲了您的方便,如果一個標籤只有一個子節點,並且該子節點 是一個字符串,該子節點可用作tag.string,如 以及tag.contents [0]。

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:' 
+0

+1謝謝你非常清楚的解釋。 :) – claws

+0

和令人驚訝的是,'.text'似乎比'.string'快得多。 – claws

+0

@ claws:這有點令人驚訝。我很好奇爲什麼,但是......不足以潛入源頭。 – abarnert

相關問題