抱歉这个愚蠢的问题......刚开始使用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()
答案 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。它适用于表格和列表。