2017-11-14 11 views
1

私はいくつかのHTLMLを持っています。これは、ほとんどクラス識別子がないので、私はBeautifulSoupをラッチする必要はほとんどありません。それは一種の次のようになります。あなたが美しいスープの兄弟である場合は、findAll

<h3>I am an important section of the list</h3> 
<ul> 
    <li><a href="commonStuff/newThing1">Important text in here</a></li> 
    <li><a href="commonStuff/newThing2">Differentmportant text in here</a></li> 
    ... 
</ul> 
<h3>I am another section of the list but I am not important</h3> 
<ul> 
    <li><a href="I look like I could be important">Cool looking info in here></li> 
    <li><a href="I look like I could be important">Cool looking info in here></li> 
</ul> 

は私だけで-間、私は気にh3タグa要素を気に。当然のことながら、私は現在、これをやっている方法は次のとおりです。

sections = part.select('h3') 
     for section in sections: 
      if "I am an important section of the list" in section: 

問題はその時点で私はヘッダータグの後のものを探していますので、私はその後何をするか知らないです。私がそれをするのを見た唯一の方法は、何らかの子供を育てることです。だから私はこれをやっている:この

  • 程度の悪い二つのものがあります

    for body in section.next_siblings: 
    

    だけ今までそれ次々と並べがあるはずです。私は兄弟姉妹は、私はあなたがhrefのリンクになってお勧めしますどのように以前の

を解析して、元のHTMLスープと同じではありませんので、私はfor links in body.find_all("a"):を行うカント

  • 複数存在することになるどんな場合に本当にunderstadnいけませんタグ内のテキストは、<h3>タグの直下にある場合のみ表示されます。

    こちらのトラブルは、<h3>タグの直後に内容を欲しいと思われるようです。私は何とかそのようなタグ間の内容でドキュメントを分割することができればうれしいです。 next_siblingについて

    res = [] 
    sections = part.find_all('h3', 
             string=lambda s:'I am an important section of the list' in s) 
    for section in sections: 
        for item in section.next_sibling.next_sibling.find_all('a'): 
         res.append(item.get('href')) 
    
    print(res) 
    
    >>>['commonStuff/newThing1', 'commonStuff/newThing2'] 
    

    説明:

    あなたのhtmlソースが<h3>後に何の改行が含まれていない場合、あなたが必要があると思い

  • 答えて

    2

    next_siblingsは、最初に次の兄弟を見つけるために、複数せずに存在しています1つだけnext_sibling。 BeautifulSoupはそれをNavigableStringと解釈します。この最初の例で

    、我々は改行を得る:

    html = """ 
    <h3>I am an important section of the list</h3> 
    <ul> 
        <li><a href="commonStuff/newThing1">Important text in here</a></li> 
        <li><a href="commonStuff/newThing2">Differentmportant text in here</a></li> 
    </ul> 
    """ 
    soup = soup(html, 'html.parser') 
    
    sections = soup.find_all('h3') 
    for section in sections: 
        print('next sibling : ', section.next_sibling) 
        print(type(section.next_sibling)) 
    

    結果:この一

    next sibling : 
    
    <class 'bs4.element.NavigableString'> 
    

    を、<h3>後に改行せずに、私たちは、直接我々が検索しているタグを取得:

    html = """ 
    <h3>I am an important section of the list</h3><ul> 
        <li><a href="commonStuff/newThing1">Important text in here</a></li> 
        <li><a href="commonStuff/newThing2">Differentmportant text in here</a></li> 
    </ul> 
    """ 
    soup = soup(html, 'html.parser') 
    
    sections = soup.find_all('h3') 
    for section in sections: 
        print('next sibling : ', section.next_sibling) 
        print(type(section.next_sibling)) 
    

    結果:

    next sibling : <ul> 
    <li><a href="commonStuff/newThing1">Important text in here</a></li> 
    <li><a href="commonStuff/newThing2">Differentmportant text in here</a></li> 
    </ul> 
    <class 'bs4.element.Tag'> 
    
    +0

    パーフェクト! Item.textは、括弧内の項目を取得して、hrefリンクをどのように取得できますか? –

    +0

    'アイテム。get( 'href') 'はすべきである – PRMoureu

    +0

    next_siblingを2回呼び出すとfind_all()が定義される理由を説明できますか?何らかの理由で、あなたが一度それをしたらそれは定義されていません。私はこれがあなたの「複数の」用語と関係していると思います –

    関連する問題