Latar Belakang: Saya cukup berpengalaman dengan Python tetapi benar-benar noob dengan BeautifulSoup

Saya mencoba mendapatkan 3 nilai dari satu kelas. Halaman yang saya kerjakan terlihat memiliki serangkaian elemen yang terlihat seperti ini:

<blockquote>
<a name="title"><p><B>Title</b> <table frame="hsides" border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue"><tr><td><font face="arial" size="2" color="#0000CC"><b><I>Subtitle</I>: Top Text.</b></font></td></tr></table> Body Text.
<a name="title2".... etc
</blockquote>

Saat ini, saya hanya membuang semua teks ke dalam daftar seperti ini:

page_html = soup(page, 'html.parser')

text = []
for a in page_html.select('a'):
    text.append(a.text)

Dan ini mengembalikan hasil di mana setiap baris terlihat seperti:

Title Subtitle: Top Text. Body Text.

Yang benar-benar saya inginkan adalah dapat mengurai setiap a menjadi satu baris dalam kerangka data yang terlihat seperti:

col1      col2                    col3
Title     Subtitle: Top Text.     Body Text.

Tapi aku terus terang sedikit di atas kepalaku.

Terima kasih

0
Paul3349 23 Januari 2020, 04:20

2 jawaban

Jawaban Terbaik

Jika semua tag <a> Anda sama, Anda dapat menggunakan ini:

from bs4 import BeautifulSoup

import pandas as pd


page = '''<blockquote>
<a name="title"><p><B>Title</b> <table frame="hsides" border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue"><tr><td><font face="arial" size="2" color="#0000CC"><b><I>Subtitle</I>: Top Text.</b></font></td></tr></table> Body Text.</blockquote>
'''
soup = BeautifulSoup(page, "html.parser")



text = []


for texts in soup.find_all('a'):
    paragraph = texts.find('p')

    title = texts.find('b').text
    subtitle = texts.find_all('b')[1].text
    other = ''.join(paragraph.find_all(text=True, recursive=False))

    d = {'col1': [title], 'col2': [subtitle],'col3' : [other]}
    df = pd.DataFrame(data=d)


print(df)

KELUARAN:

   col1                 col2          col3
0  Title  Subtitle: Top Text.    Body Text.
1
Omer Tekbiyik 23 Januari 2020, 02:41

Hanya menggunakan segmen HTML yang Anda bagikan:

from bs4 import BeautifulSoup

content = '<a name="title"><p><B>Title</b> ' \
          '<table frame="hsides" border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue">' \
          '<tr><td><font face="arial" size="2" color="#0000CC"><b><I>Subtitle</I>: Top Text.</b></font>' \
          '</td></tr></table> Body Text.'

soup = BeautifulSoup(content, 'html.parser')
articles = soup.find_all('a')

for article in articles:
    paragraph = article.find('p')
    print({
        'title': article.find('b').text,
        'subtitle': article.select('table i')[0].text,
        'body': ''.join(paragraph.find_all(text=True, recursive=False))
    })

Karena pertanyaannya terutama tentang BeautifulSoup, bukan tentang Pandas, saya pikir kamus sudah cukup dan Anda bisa memasukkannya ke dalam kerangka data atau struktur data lainnya sendiri?

Hasil:

{'title': 'Title', 'subtitle': 'Subtitle', 'body': '  Body Text.'}
1
Grismar 23 Januari 2020, 01:47