0

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

问题: 我想从中心抓取数据以记录叙利亚的中提琴。目前我正在使用这个刮板来收集数据。问题是我只能访问一行,而不是从表中刮掉所有行。首选输出应如下所示

姓名 状态 性别 省份 地区 死亡日期 死亡原因

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()
4

1 回答 1

0

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

这是固定的脚本。请注意,必须使用 utf-8 编解码器,因为该页面在文本中包含 unicode。您应该验证这是否得到了您想要的一切。空标签导致 Beautiful Soup 出现一些问题。

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。它适用于表格和列表。

于 2012-09-13T00:38:55.047 回答