【问题标题】:Why do I get None when text is available in the table column?当表格列中的文本可用时,为什么我得到无?
【发布时间】:2014-09-20 10:00:55
【问题描述】:

我正在使用 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

【问题讨论】:

  • 值得注意的是,您尝试处理的 HTML 非常混乱,混合了 HTML3 中已弃用并在 HTML4 中删除的 HTML2 功能,以及在 3 或 4 中添加的功能。如果您正在尝试学习 BeautifulSoup,从解析有效 HTML4 的页面开始可能会容易得多,只有在您更好地理解了之后才尝试学习如何处理可怕的 HTML。

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


【解决方案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

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

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

【讨论】:

    【解决方案2】:

    问题是第二行的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:'
    

    【讨论】:

    • 令人惊讶的是,.text 似乎比 .string 快得多。
    • @claws:这有点令人惊讶。我有点好奇为什么,但是……还不足以深入研究源头。
    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2015-03-10
    相关资源
    最近更新 更多