2017-09-26 15 views
0

同じdivクラス内に2つの<tr>タグがあります。最初のtrタグはテキストをうまく印刷します。私は持っているコンテナ内の2番目のtrタグにアクセスしようとしていますが、動作しないようです。すべてのコンテナに2番目の<tr>タグがあるわけではありませんので、最初に存在するかどうかを確認するにはif文が必要です。それがそうであれば、そこからテキストを印刷します。ありがとう!同じdivクラスの2番目の子供の美しいスープスカーフテキスト

page_soup = soup(page_html, "html.parser") 

containers = page_soup.findAll("div",{"class":"right"}) 

for container in containers: 
    print(container.span.text) 
    print(container.tr.text) 

    if container.nextSiblings('tr')[1]: 
     print(container.nextSiblings('tr')[1].text) 
+0

はこれを見ている:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-next-siblings-and-find -next-siblingこれは役に立ちました – Shashank

答えて

0

あなたは、コンテナ内のすべてのtrの要素を見つけ、あなたが持っているどのようにそれらの多くチェックすることができます。

for container in containers: 
    trs = container("tr") # same as container.find_all("tr") 

    if len(trs) > 1: 
     print(trs[1].get_text()) 

ます。また、直接、単一のすべてのコンテナ内の第2 trを見つけることができますCSS selector

for tr in soup.select(".right > tr:nth-of-type(2)"): 
    print(tr.get_text()) 

デモ:

from bs4 import BeautifulSoup 


data = """ 
<body> 
    <div class="right"> 
     <tr>container 1 row 1</tr> 
     <tr>container 1 row 2</tr> 
    </div> 
    <div class="right"> 
     <tr>container 2 row 1</tr> 
    </div> 
    <div class="right"> 
     <tr>container 3 row 1</tr> 
     <tr>container 3 row 2</tr> 
     <tr>container 3 row 3</tr> 
    </div> 
</body> 
""" 

soup = BeautifulSoup(data, "html.parser") 
for tr in soup.select(".right > tr:nth-of-type(2)"): 
    print(tr.get_text()) 
を印刷します:

container 1 row 2 
container 3 row 2 
+0

素晴らしいことがありました! btw、なぜあなたの構文のいくつかが私のものと違うのだろうか?あなたの.find_allと比較して.find_all?それはあなたのpython 2.7を使用しているからですか?申し訳ありません、私はPythonに新しくなりました – itschrisho

+0

@itschrisho nono、 'findAll()'はこの時点で廃止された "旧式の" BeautifulSoupバージョン3スタイルです。ありがとう。 – alecxe

関連する問題