使用BeautifulSoup在表格中选取文本,在网页上

时间:2014-07-23 07:42:19

标签: python beautifulsoup

我想使用BeautifulSoup在公司的网页上获取“模型类型”值,这些值来自以下代码:

它形成了网页上并排显示的2个表格。

更新了网页的源代码

<TR class=tableheader>
<TD width="12%">&nbsp;</TD>
<TD style="TEXT-ALIGN: left" width="12%">Group </TD>
<TD style="TEXT-ALIGN: left" width="15%">Model Type </TD>
<TD style="TEXT-ALIGN: left" width="15%">Design Year </TD></TR>
<TR class=row1>
<TD width="10%">&nbsp;</TD>
<TD class=row1>South West</TD>
<TD>VIP QB662FG (Registered) </TD>
<TD>2013 (Registered) </TD></TR></TBODY></TABLE></TD></TR>

我正在使用以下但是它没有得到'VIP QB662FG'想要:

from bs4 import BeautifulSoup
import urllib2

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

find_it = soup.find_all(text=re.compile("Model Type "))
the_value = find_it[0].findNext('td').contents[0]

print the_value

我能以什么方式得到它?我使用的是Python 2.7。

3 个答案:

答案 0 :(得分:1)

您正在寻找下一个,然后是同一位置的下一个单元格。后者很棘手;我们可以假设它始终是第3列:

header_text = soup.find(text=re.compile("Model Type "))
value = header_cell.find_next('tr').select('td:nth-of-type(3)')[0].get_text()

如果您只是要求下一个td,则会转到Design Year列。

有可能有更好的方法来到你的一个细胞;例如,如果我们假设只有一个tr行与类row1,则以下步骤将获得您的值:

value = soup.select('tr.row1 td:nth-of-type(3)')[0].get_text()

答案 1 :(得分:1)

我认为你可以这样做:

from bs4 import BeautifulSoup

html = """<TD colSpan=3>Desinger </TD></TR>
<TR>
<TD class=row2bold width="5%">&nbsp;</TD>
<TD class=row2bold width="30%" align=left>Gender </TD>
<TD class=row1 width="20%" align=left>Male </TD></TR>
<TR>
<TD class=row2bold width="5%">&nbsp;</TD>
<TD class=row2bold width="30%" align=left>Born Country </TD>
<TD class=row1 width="20%" align=left>DE </TD></TR></TBODY></TABLE></TD>
<TD height="100%" vAlign=top>
<TABLE class=tableforms>
<TBODY>
<TR class=tableheader>
<TD colSpan=4>Remarks </TD></TR>

<TR class=tableheader>
<TD width="12%">&nbsp;</TD>
<TD style="TEXT-ALIGN: left" width="12%">Group </TD>
<TD style="TEXT-ALIGN: left" width="15%">Model Type </TD>
<TD style="TEXT-ALIGN: left" width="15%">Design Year </TD></TR>
<TR class=row1>
<TD width="10%">&nbsp;</TD>
<TD class=row1>South West</TD>
<TD>VIP QB662FG (Registered) </TD>
<TD>2013 (Registered) </TD></TR></TBODY></TABLE></TD></TR>"""

soup = BeautifulSoup(html, "html.parser")
soup = soup.find('table',{'class':'tableforms'})

dico = {}
l1 = soup.findAll('tr')[1].findAll('td')
l2 = soup.findAll('tr')[2].findAll('td')
for i in range(len(l1)):
    dico[l1[i].getText().strip()] = l2[i].getText().replace('(Registered)','').strip()

print dico['Model Type']

打印:u'VIP QB662FG'

答案 2 :(得分:1)

查找所有tr并输出它的第三个孩子,除非它是第一行

import bs4    
data = """
<TR class=tableheader>
<TD width="12%">&nbsp;</TD>
<TD style="TEXT-ALIGN: left" width="12%">Group </TD>
<TD style="TEXT-ALIGN: left" width="15%">Model Type </TD>
<TD style="TEXT-ALIGN: left" width="15%">Design Year </TD></TR>
<TR class=row1>
<TD width="10%">&nbsp;</TD>
<TD class=row1>South West</TD>
<TD>VIP QB662FG (Registered) </TD>
<TD>2013 (Registered) </TD>
"""
soup = bs4.BeautifulSoup(data)
#table = soup.find('tr', {'class':'tableheader'}).parent
table = soup.find('table', {'class':'tableforms'})
for i,tr in  enumerate(table.findChildren()):
    if i>0:
        for idx,td in enumerate(tr.findChildren()):
            if idx==2:
                print td.get_text().replace('(Registered)','').strip()