bugfix> python > 投稿

私はPython 3.6とbeautfulsoup4を使用しています

最初のノードがあります:

title = self.html.find(id=(lists[1][selectionindex]))

これはどれもではなく、このノードは赤で強調表示されています:

青色のノード(任意のdiv/pノード)のリストを取得できますが、h1/2/3ノードに到達すると停止する方法

回答 2 件
  • 私はあなたが最初の <h3> を見つけることができると仮定しています   id を使用したタグ  (コードに示されているように)。次のコードは、すべての <p> を取得します  および <div>   <h3> の後のタグ  タグを付け、 <h1> のいずれかが検出されると停止します 、 <h2>  または <h3>  鬼ごっこ。

    html = '''
    <p>unwanted</p>
    <h3 id="special">some text</h3>
    <div class="foo">wanted</div>
    <p>wanted</p>
    <p>wanted</p>
    <p>wanted</p>
    <h2>some text</h2>'''
    soup = BeautifulSoup(html, 'html.parser')
    list_of_wanted_tags = []
    starting_tag = soup.find('h3', id='special')
    for tag in starting_tag.find_all_next():
        if tag.name in ('div', 'p'):
            list_of_wanted_tags.append(tag)
        elif tag.name in ('h1', 'h2', 'h3'):
            break
    print(list_of_wanted_tags)
    # [<div class="foo">wanted</div>, <p>wanted</p>, <p>wanted</p>, <p>wanted</p>]
    
    

    find_all_next()  メソッドは、現在のタグの後にあるすべてのタグのリストを返します。


    <p> だけでなく、2つのタグの間のすべてのタグが必要な場合  および <div>  タグ、これを使用:

    for tag in starting_tag.find_all_next():
        if tag.name in ('h1', 'h2', 'h3'):
            break
        list_of_wanted_tags.append(tag)
    
    

    または、 itertools.takewhile を使用して同じ :

    wanted = list(itertools.takewhile(lambda tag: tag.name not in ('h1', 'h2', 'h3'), start.find_all_next()))
    
    

  • BeautifulSoupの find_all を使用できます  特定のHTMLタグのすべてのインスタンスを取得する関数。

    import requests, lxml
    from bs4 import BeautifulSoup
    r = requests.get('https://www.google.co.uk')
    soup = BeautifulSoup(r.content, "lxml")
    f = soup.find_all("p")
    for p in f:
        print p
    
    

あなたの答え