2017-03-07 18 views
0
<p class=""> 
    Teacher: 
<a href="/name/nm12345/?ref_=adv_0" 
>Scott</a> 
      <span class="ghost">|</span> 
    Students: 
<a href="/name/nm12345/?ref_=adv_1" 
>Benedict</a>, 
<a href="/name/nm12345/?ref_=adv_2" 
>Chiwetel</a>, 
<a href="/name/nm12345/?ref_=adv_3" 
>Rachel</a>, 
<a href="/name/nm12345/?ref_=adv_4" 
>Benedict Wong</a> 
    </p> 

"先生"のタグの下にある "スコット"を抽出し、 "生徒"のタグの下にすべての生徒の名前を抽出したいと思います。 soup.find(lambda tag:tag)をし、それが私はそれが正しいアプローチではないと思います美味しいスープで少々の値を抽出する

<a href="/name/nm12345/?ref_=adv_0" 
>Scott</a> 

が返されました:私は試してみました。どのコードが実際に「先生」の下の名前と「学生」タグの両方を抽出するためにすべきですか?

答えて

1

他のページの解析時にHTMLブロックがあまり変化しないとすれば、pというタグをクラス(この例ではなし)で見つけ、Teacherのテキストが存在するかどうかを確認できます。

要素の最初のaであるpタグから.contents[1]を取得すると、

次はhref属性があなたの教師と一致していませんれているすべてのaのタグを見つけます。

例:

from bs4 import BeautifulSoup 

example = """<p class=""> 
Teacher: 
<a href="/name/nm12345/?ref_=adv_0" 
>Scott</a> 
     <span class="ghost">|</span> 
Students: 
<a href="/name/nm12345/?ref_=adv_1" 
>Benedict</a>, 
<a href="/name/nm12345/?ref_=adv_2" 
>Chiwetel</a>, 
<a href="/name/nm12345/?ref_=adv_3" 
>Rachel</a>, 
<a href="/name/nm12345/?ref_=adv_4" 
>Benedict Wong</a> 
</p>""" 

soup = BeautifulSoup(example, "html.parser") 

Classroom = soup.find(lambda x: "Teacher" in x.get_text()) 

if Classroom is not None: 

    Teacher = Classroom.contents[1] 
    TeacherUrl = Teacher["href"] 

    Students = Classroom.find_all(lambda tag: tag.has_attr('href') and TeacherUrl not in tag["href"]) 

    print (Teacher.text) 
    for Student in Students: 
     print (Student.text) 

出力:

スコット

ベネディクト

Chiwetel

レイチェル

ベネディクト・ウォン

関連する問題