BeautifulSoupでスクレイピングしているテーブルがあり、特定のセルに特定の文字列がある場合に行全体を印刷できるようにしようとしています。以下のコードはまったく何も出力しておらず、その理由がわかりません。forループがなく、データ変数を出力するだけの場合、大量の情報が返されるので、forループに問題があります。
問題は、「チェック」という単語がどこにあるのか、テーブルに何回表示されるのかわからないため、インデックスだけを見ることができないということです。PythonとBeautifulSoupを使用してテーブルを解析することを見てきましたが、特定の文字列ではなく、タグを探しているように見えます。私はこの情報を使って作業してみました:http://www.briancarpio.com/2012/12/02/website-scraping-with-python-and-beautiful-soup/、しかしそれはどのインデックスと話すかを正確に知っているので、ここでは役に立たなかった。
何か案は?
nextpage=logged_in.read() #let's read the page once we get logged in
soup=BeautifulSoup(nextpage, "lxml") #BeautifulSoup told me to do this
table = soup.findAll("table", {'class':'table2'}) #Find the table we want to work with
data = [[td.findChildren(text=True) for td in tr.findAll("td")] for tr in table] #Find the cells for each table row
for line in table: #if you see a line in the table
if line.find('Check'): #and you find the specific string
print line #print it
print "Hey, this did run!" #debug statement
2つの考えられる問題があります。
1つ目(そして最も可能性が高い)は、タグと文字列を混同していることです。あなたのコードにはあなたが持っています
for line in table: #if you see a line in the table
if line.find('Check'): #and you find the specific string
print line #print it
最初の行line
は、タグであるを示します。次に、PythonではなくBeautifulSoupのfind
メソッドを使用しているため、実際には、文字列「Check」ではなく、という名前のタグを探しています。タグがないため、印刷行が実行されることはありません。Check
Check
2番目のオプションはfind
、文字列内の「Check」という単語の位置を返すpythonメソッドを実際に使用することです。チェックはタグ内の唯一の文字列であるため<span style="color:green">Check</span>
、Pythonfind
は0を返し、したがってif
ステートメントはfalseになります。(これが起こっていることではないと思いますが、false
0ではなく0を意味するように常に注意する必要があります)
コードを次のように変更して実行します。
for line in table: #if you see a line in the table
if line.get_text().find('Check') > -1 : #and you find the specific string
print line #print it
このコードはget_text()
、タグから文字列を取得するためにaを実行し、次にPython文字列find
を実行して「check」が文字列に含まれているかどうかを確認します。そうでない場合は、-1を返します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加