使用BeautifulSoup 4从网页中提取表格

时间:2013-12-05 15:49:18

标签: python sql beautifulsoup

宽恕,今天才开始使用beautifulSoup来解决这个问题。

我已经设法通过拖动网站上的网址来实现它的工作,本网站上的每个产品页面都有一个如下所示的表格:

<table width="100%" class="product-feature-table">
  <tbody>
    <tr>
      <td align="center"><table cellspacing="0" class="stats2">
        <tbody>
          <tr>
          <td class="hed" colspan="2">YYF Shutter Stats:</td>
          </tr>
          <tr>
          <td>Diameter:</td>
          <td>56 mm / 2.20 inches</td>
          </tr>
          <tr>
            <td>Width:</td>
            <td>44.40 mm / 1.74 inches</td>
          </tr>
          <tr>
            <td>Gap Width:</td>
            <td>4.75 mm / .18 inches</td>
          </tr>
          <tr>
            <td>Weight:</td>
            <td>67.8 grams</td>
          </tr>
          <tr>
            <td>Bearing Size:</td>
            <td>Size C (.250 x .500 x .187)<br>CBC SPEC Bearing</td>
          </tr>
          <tr>
            <td>Response:</td>
            <td>CBC Silicone Slim Pad (19mm)</td>
          </tr>
        </tbody>
        </table>
      <br>
      <br>
      </td>
    </tr>
  </tbody>
</table>

我试图将此表格转换为某种形式的数据,我可以在网络应用程序中使用。

我如何从每个网页中提取这个内容,该网站有大约400个包含此表的产品页面,我最好从页面中获取每个表并将其放入数据库条目或带有产品名称的文本文件。

正如您所看到的,表格格式不正确,但它是标有

的页面上唯一的表格
class="product-feature-table"

我刚刚尝试编辑一个URL抓取脚本,但我开始觉得我试图这样做是错误的。

我的网址脚本如下:

import urllib2
from bs4 import BeautifulSoup

url = raw_input('Web-Address: ')

html = urllib2.urlopen('http://' +url).read()
soup = BeautifulSoup(html)
soup.prettify()
for anchor in soup.findAll('a', href=True):
    print anchor['href']

我可以将所有这些网址添加到文本文件中,但更喜欢使用Sqlite或Postgresql,是否有任何在线文章可以帮助我更好地理解这些概念,不会淹没新手?

2 个答案:

答案 0 :(得分:0)

你可能已经来过这里了,但是当我一段时间使用BS(没有双关语)时,它的doc页面就是我开始的地方:http://www.crummy.com/software/BeautifulSoup/bs4/doc/

就个人而言,我发现这个官方文档本来可以更好,当时网络社区的美丽汤资源似乎也很缺乏 - 这大概是在3或4年前。但

我希望两者都来得更远。

另一个值得研究的资源是Mechanize:http://wwwsearch.sourceforge.net/mechanize/

答案 1 :(得分:0)

首先,如果您想使用BeautifulSoup提取网站内的所有表格,您可以通过以下方式进行:

import urllib2
from bs4 import BeautifulSoup

url = raw_input('Web-Address: ')

html = urllib2.urlopen('http://' +url).read()
soup = BeautifulSoup(html)
soup.prettify()

# extract all the tables in the HTML 
tables = soup.find_all('table')

#get the class name for each
for table in tables:
  class_name = table['class']

一旦您拥有了页面中的所有表格,您就可以通过以下方式为标记 tr td 移动所需的任何内容:

for table in tables:
  tr_tags = table.find_all('tr')

请记住, tr 标记是表格内的行。然后要获取标签 td 中的数据,您可以使用以下内容:

for table in tables:
  tr_tags = table.find_all('tr')

  for tr in tr_tags:
    td_tags = tr.find_all('td')

    for td in td_tags:
      text = td.string  

如果你想浏览表格中的所有链接然后找到表格,上面解释的代码对你有用,首先检索所有网址然后在它们之间移动。例如:

initial_url = 'URL'
list_of_urls = []

list_of_url.append(initial_url)

while len(list_of_urls) > 0:

  html = urllib2.urlopen('http://' + list_of_url.pop()).read()
  soup = BeautifulSoup(html)
  soup.prettify()

  for anchor in soup.find_all('a', href=True):
     list_of_urls.append(anchor['href'])

  #here put the code explained above, for example

  for table in tables:
    class_name = table['class']

    # continue with the above code..

要在SQLite中将数据插入数据库,我建议您阅读以下教程 Python: A Simple Step-by-Step SQLite Tutorial