0

ばかげた質問でごめんなさい...Pythonを使い始めたばかりです(でも私はそれが大好きです)。

問題:シリアでの暴力の記録のためにセンター からデータを取得したい。現在、このスクレーパーを使用してデータを収集しています。問題は、テーブルからすべての行を取得するのではなく、1つの行にしかアクセスできないことです。推奨される出力は次のようになります

名前ステータス性別地域地域死亡原因死亡原因

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を呼び出して、必要な行のテキストを取得します。内部ループ内から各行をファイルに書き込みます。

これが修正されたスクリプトです。ページのテキストにUnicodeが含まれているため、utf-8コーデックを使用する必要があることに注意してください。これで必要なものがすべて得られていることを確認する必要があります。空のタグがBeautifulSoupにいくつかの問題を引き起こしていました。

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

これを行うもう1つの気の利いた方法は、Scrapemarkを使用することです。テーブルやリストに最適です。

于 2012-09-13T00:38:55.047 に答える