有关使用BeautifulSoup for HTML Tables的建议

时间:2014-01-03 15:38:54

标签: python html web-scraping beautifulsoup

我正在尝试使用BeautifulSoup从HTML文件中获取信息。通过soup.table.table.tbody.find_all('table', attrs={'cellspacing' : '0'})缩小'汤'后,这是我必须使用的那种html(我删除了一些html以节省空间):

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME CITY</td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME ADDRESS</td></tr>
<tr><td>SOME ADDRESS 2</td></tr>
<tr><td>SOME CITY, STATE, ZIPCODE</td></tr>
<tr><td><a class="icon_arrow" href="http://SOMEURL" onclick="window.open('http://SOMEWEBSITE'); return false;" target="_blank">Visit website</a></td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME NAME </td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td nowrap="nowrap">SOME TELEPHONE</td></tr>
<tr><td><a class="icon_arrow" href="/mcs/iframecontactUsFormAction.do?toEmail=SOME@EMAIL.COM" onclick="window.open(%=contactUs%); return false;" target="_blank">E-mail Me</a></td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME CTIY</td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME ADDRESS</td></tr>
<tr><td>SOME ADDRESS2</td></tr>
<tr><td>SOME CITY, STATE, ZIPCODE</td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME NAME </td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td nowrap="nowrap">SOME TELEPHONE</td></tr>
<tr><td><a class="icon_arrow" href="/mcs/iframecontactUsFormAction.do?toEmail=SOME@EMAIL.COM" onclick="window.open(%=contactUs%); return false;" target="_blank">E-mail Me</a></td></tr>
</tbody>
</table>
</table>

这些页面的格式类似,有些记录的记录更多或更少。我有兴趣提取的信息是SOME CITY,SOME ADDRESS,SOME ADDRESS2,SOME CITY,STATE,ZIPCODE,NAME,SOME TELEPHONE和SOME@EMAIL.COM(虽然这可以跳过)。

查看html,似乎所有相关信息都在标签之间。我很难让BS找到那些标签来提取信息。

3 个答案:

答案 0 :(得分:1)

在html文档中找到确切的部分可以通过一些特定的标记名称和属性来完成,如果这是不可能的,就像你共享的html,并且文档结构是可预测的,请考虑使用标记 position < / strong>,意思是.fine_all('tag name')[nth location]

例如:

>>> soup.find_all('table')[1].tbody.find_all('td')[2]
<td>SOME CITY, STATE, ZIPCODE</td>

答案 1 :(得分:1)

您可以使用以下代码:

tables = soup.table.table.tbody.find_all('table', attrs={'cellspacing' : '0'})
for ta in tables:
    tds = ta.find_all('td')
    for td in tds:
        text = td.get_text()
        if "E-mail Me" not in text and "Visit website" not in text:
            print text

答案 2 :(得分:0)

您可以通过将各个代码添加到现有代码的末尾来搜索它们吗?我也会将它保存到某个变量(它将作为列表返回,我很确定)。像

这样的东西
    info =soup.table.table.tbody.find_all('table', attrs={'cellspacing' : '0'}).find_all('td')

然后提取,只需使用get_text迭代列表:

    for item in info:
        item.get_text()