2017-11-15 18 views
1

フォーラムスレッドからすべての投稿を取得しようとしています。ほとんどの投稿はすべて正常に機能しますが、投稿が返信で元のメッセージが含まれている場合は返信できません。私はsoup.findAll(...)がHTMLソースからすべての子を返さないことを発見しました(下の画像参照)。 (:SI-SI JE suisのLà... 'P' タグで)画像2のHTMLからの私は、私はまた、以下の何を取得する必要BeautifulSoup - findAll()はすべての子孫を返しません

<b>Citation :</b><br/> 

を取得します。実際には、私はこの 'p'タグにあるものだけを必要としています。あなたの助けのための

import requests 
from bs4 import BeautifulSoup as bsoup 

site_source = requests.get("http://forum.doctissimo.fr/sante/audition/acouphene-mouvement-secouant-sujet_152572_1.htm").content 
soup = bsoup(site_source, "html.parser") 

# Get text from forum posts 

post_boxes = soup.findAll("td", class_="messCase2", style="border-bottom:0") 

for post_box in post_boxes: 
    message = post_box.find("div", itemprop="text") 
    for line in message: 
     print(line) 

Picture: new post (the parsing works)

Picture: reply post

感謝。

答えて

0

.descendantsを使用して、Tagオブジェクト内のすべての子に再帰的にアクセスします。

しかし、もっと大きな問題があります。あなたが提供したリンクは、「返信投稿」のスクリーンショットと同じHTML構造を与えません。実際のリンクでは、追加の<p>タグは、コンテンツが<div>で、id=77714の一部ではありません。 <div>が適切に閉じられていないようだが、それはがある<p>タグ内にネストされていることを

HTML source

:ここではChromeのあなたが興味のあるコンテンツのため、このページのタブを点検してからのスクリーンショットですが次の<div class="container">の前に閉じられました。お使いのブラウザは<p></p>としてダングリング</p>を帰属している可能性があり

(。これは、質問を投稿するときのスクリーンショットに依存しない一つの良い理由です)、しかしBeautifulSoupは見かけタグ閉鎖を尊重している - あなたのターゲットが表示されない理由です子どもたちのコンテンツを設定します。

はここにあなたの<div>が実際に含まれているものです:

import requests 
from bs4 import BeautifulSoup as bsoup 

site_source = requests.get("http://forum.doctissimo.fr/sante/audition/acouphene-mouvement-secouant-sujet_152572_1.htm").content 
soup = bsoup(site_source, "html.parser") 

div = soup.find_all("div", id="para77714") 

for tag in div: 
    for subtag in tag.descendants: 
     print(subtag) 

出力:

<div itemprop="text"><b>Citation :</b><br/></div> 
<b>Citation :</b> 
Citation : 
<br/> 

主な問題は、このページのHTMLが混乱であるということです。 BeautifulSoupかなり正にその頭や尾を作ることはできません。たとえば、<p>タグで囲まれていますが、その前に悪いクロージャが混乱しているため、コンテンツをラップする有効なタグは実際にはありません。のように見えます。

あなたは少し開始<div>過ぎタグの階層を下に繰り返す場合は、これを見ることができます:

ct = 0 
for tag in div.find_all_next(): 
    ct+=1 
    if (ct < 15) & (ct > 12): 
     for subtag in tag: 
      print(f"tag name: {subtag.name}") 
      print(f"{subtag.string}\n") 

tag name: None 
Afficher moins 

tag name: br 
None 

tag name: br 
None 

tag name: br 
None 

tag name: None 
si-si je suis là <--- this is what you want, but it is not in a valid <p> tag 

tag name: img 
None 
# ... 

TL; DR - BeautifulSoupがうまく働いている、それは逮捕だこのWebページです。

+0

ありがとうございました!私はこれを初めて知ったので、BeautifulSoupについていくつかの基本的なことが不足しています。あなたの説明は非常に明確です。私は私のプロジェクトのために、私は '手動で'階層を繰り返し、文字列オブジェクトをチェックするので、私はこれらを保持すると思います。 –

+0

あなたは大歓迎です。不正な形式のHTMLは、うまく動作する苦労です。この回答があなたの質問を解決した場合は、回答の左側にあるチェックマークをクリックして受け入れてください。 –

関連する問題