如何使用Beautiful Soup解析器刮取多个HTML表格?

时间:2012-09-12 07:54:41

标签: html-parsing beautifulsoup

抱歉这个愚蠢的问题......刚开始使用python(但我很喜欢)。

问题: 我想从center for documentation of violism in syria抓取数据。目前我正在使用这个刮刀收集数据。问题是我只能访问一行而不是从表中抓取所有行。 首选输出应该是

姓名状态性别省份区域dateofdeath causeofdeath

import urllib2
from BeautifulSoup import BeautifulSoup
f = open('syriawar.tsv', 'w')
f.write("Row" + "\t" + "Data" + "\n")

for x in range (0,249):


syria = "file" + "\t" + str(x)
print "fetching data ... " + syria


url ='http://vdc-sy.org/index.php/en/martyrs/' + str(x) + '/c29ydGJ5PWEua2lsbGVkX2RhdGV8c29ydGRpcj1ERVNDfGFwcHJvdmVkPXZpc2libGV8c2hvdz0xfGV4dHJhZGlzcGxheT0wfA==' 

page = urllib2.urlopen(url)
soup = BeautifulSoup(page)

sentence = soup.findAll('tr')[3].text

words = sentence
Data = str(words)

f.write(str(x) + "\t" + Data + "\n" )

f.close()

1 个答案:

答案 0 :(得分:0)

您需要另一层迭代。您应该首先调用findAll('tr')来获取所有行。然后删除作为标题的行并清空,然后遍历其余行并在这些元素上调用.text以获取所需行的文本。从内循环中将每一行写入文件。

这是修复的脚本。请注意,必须使用utf-8编解码器,因为该页面在文本中包含unicode。你应该验证这是否能得到你想要的一切。空标签导致了美丽的汤有些问题。

import urllib2
from bs4 import BeautifulSoup
import codecs

f = codecs.open('syriawar.tsv', 'w', 'utf-8')
f.write("Row" + "\t" + "Data" + "\n")

for x in range (0,249):

  syria = "file" + "\t" + str(x)
  print "fetching data ... " + syria

  url ='http://vdc-sy.org/index.php/en/martyrs/' + str(x) + '/c29ydGJ5PWEua2lsbGVkX2RhdGV8c29ydGRpcj1ERVNDfGFwcHJvdmVkPXZpc2libGV8c2hvdz0xfGV4dHJhZGlzcGxheT0wfA=='

  page = urllib2.urlopen(url)
  soup = BeautifulSoup(page)

  rows = soup.findAll('tr')

  i = 0;
  for row in rows[3:]:
     if i%2 == 0:
        f.write(str(i/2) + "\t" + row.text + "\n" )
     i += 1

f.close()

另一种方法是使用Scrapemark。它适用于表格和列表。

相关问题