使用Python + BeautifulSoup在网页上的表格中拾取文本

时间:2014-09-02 03:35:35

标签: python html-parsing beautifulsoup

我想在网页上找一个日期。

原始网页源代码如下:

<TR class=odd>
<TD>
<TABLE class=zp>
<TBODY>
<TR>
<TD><SPAN>Expiry Date</SPAN>2016</TD></TR></TBODY></TABLE></TD>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD></TR>

我想拿起'2016',但我失败了。我能做的最多就是:

page = urllib2.urlopen('http://www.thewebpage.com')
soup = BeautifulSoup(page.read())

a = soup.find_all(text=re.compile("Expiry Date"))

我试过了:

b = a[0].findNext('').text
print b

b = a[0].find_next('td').select('td:nth-of-type(1)')
print b

它们都没有成功。

有任何帮助吗?感谢。

2 个答案:

答案 0 :(得分:1)

有多种选择。

选项#1(使用CSS selector,非常明确地指示元素的路径):

from bs4 import BeautifulSoup

data = """
<TR class="odd">
    <TD>
        <TABLE class="zp">
            <TBODY>
                <TR>
                    <TD>
                        <SPAN>
                            Expiry Date
                        </SPAN>
                        2016
                    </TD>
                </TR>
            </TBODY>
        </TABLE>
    </TD>
    <TD>&nbsp;</TD>
    <TD>&nbsp;</TD>
</TR>
"""

soup = BeautifulSoup(data)
span = soup.select('tr.odd table.zp > tbody > tr > td > span')[0]
print span.next_sibling.strip()  # prints 2016

我们基本上是这样说的:给我直接位于span内的td标记,该tr直接位于直接位于tbody内的table内部带有zp类的tr标记位于带有odd类的span标记内。然后,我们使用next_sibling获取span代码后的文字。


选项#2(查找span = soup.find('span', text=re.compile('Expiry Date')) print span.next_sibling.strip() # prints 2016 by text;认为它更具可读性)

re.compile()
需要

import re,因为文本周围可能有多行和其他空格。不要忘记{{1}}模块。

答案 1 :(得分:0)

css选择器的替代方案是:

import bs4

data = """
<TR class="odd">
    <TD>
        <TABLE class="zp">
            <TBODY>
                <TR>
                    <TD>
                        <SPAN>
                            Expiry Date
                        </SPAN>
                        2016
                    </TD>
                </TR>
            </TBODY>
        </TABLE>
    </TD>
    <TD>&nbsp;</TD>
    <TD>&nbsp;</TD>
</TR>
"""

soup = bs4.BeautifulSoup(data)
exp_date = soup.find('table', class_='zp').tbody.tr.td.span.next_sibling
print exp_date # 2016

要了解BeautifulSoup,我建议您阅读documentation