Pertanyaan Bagaimana cara menggunakan BeautifulSoup untuk mencari daftar tag, dengan satu item dalam daftar yang memiliki atribut?


Apakah ada yang tahu cara menggunakan bs4 di python untuk mencari beberapa tag, salah satunya akan membutuhkan atribut?

Misalnya, untuk mencari semua kemunculan satu tag dengan atribut, saya tahu saya bisa melakukan ini:

tr_list = soup_object.find_all('tr', id=True)

Dan saya tahu saya juga bisa melakukan ini:

tag_list = soup_object.find_all(['a', 'b', 'p', 'li'])

Tapi saya tidak bisa mencari cara untuk menggabungkan dua pernyataan, yang secara teori akan memberi saya daftar, dalam rangka terjadinya semua tag html tersebut, dengan masing-masing tag 'tr' memiliki id.

potongan html akan menjadi seperti di bawah ini:

  <tr id="uniqueID">
   <td nowrap="" valign="baseline" width="8%">
    <b>
     A_time_as_text
    </b>
   </td>
   <td class="storyTitle">
    <a href="a_link.com" target="_new">
     some_text
    </a>
    <b>
     a_headline_as_text
    </b>
    a_number_as_text
   </td>
  </tr>
  <tr>
   <td>
    <br/>
   </td>
   <td class="st-Art">
    <ul>
     <li>
      more_text_text_text
      <strong>
       more_text_text_text
       <font color="228822">
        more_text_text_text
       </font>
      </strong>
      more_text_text_text
     </li>
     <li>
      more_text_text_text
      <ul>
       <li>
        more_text_text_text
       </li>
      </ul>
     </li>
    </ul>
   </td>
  </tr>
  <tr>
  </tr>

Terima kasih atas semua bantuannya!


4
2018-01-31 03:53


asal


Jawaban:


Saya sarankan Anda menambahkan tr ke daftar tag yang diperlukan dan kemudian memeriksa keberadaannya id atribut dalam loop:

from bs4 import BeautifulSoup

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

for tag in soup.find_all(['a', 'b', 'p', 'li', 'tr']):
    if tag.name != 'tr' or (tag.name == 'tr' and tag.get('id')):
        print tag.name

Untuk html Anda, ini akan menampilkan:

tr
b
a
b
li
li
li

Perhatikan, jika Anda benar-benar mencoba untuk mendapatkannya a  b  p dan li tag yang ada di dalam tr dengan sebuah id hadir, maka pendekatan berikut akan lebih sesuai:

for tr in soup.find_all('tr', id=True):
    for tag in tr.find_all(['a', 'b', 'p', 'li']):
        print tag.name, tag.get_text(strip=True)

Ini akan memberi Anda:

b A_time_as_text
a some_text
b a_headline_as_text

2
2018-01-31 12:34