Cara mengurai semua konten teks dari HTML menggunakan Beautiful Soup

Saya ingin mengekstrak konten pesan email. Itu ada dalam konten html, menggunakan BeautifulSoup untuk mengambil Dari, Ke dan subjek. Saat mengambil konten isi, ia mengambil baris pertama saja. Itu meninggalkan baris dan paragraf yang tersisa.

Saya melewatkan sesuatu di sini, cara membaca semua baris/paragraf.

KODE:

email_message = mail.getEmail(unreadId)
print (email_message['From'])
print (email_message['Subject'])

if email_message.is_multipart():
    for payload in email_message.get_payload():
        bodytext = email_message.get_payload()[0].get_payload()
        if type(bodytext) is list:
            bodytext = ','.join(str(v) for v in bodytext)
else:
    bodytext = email_message.get_payload()[0].get_payload()
    if type(bodytext) is list:
        bodytext = ','.join(str(v) for v in bodytext)
print (bodytext)
parsedContent = BeautifulSoup(bodytext)
body = parsedContent.findAll('p').getText()
print body

Konsol:

body = parsedContent.findAll('p').getText()
AttributeError: 'list' object has no attribute 'getText'

Ketika saya menggunakan

body = parsedContent.find('p').getText()

Itu mengambil baris pertama konten dan tidak mencetak baris sisanya.

Ditambahkan

Setelah mendapatkan semua baris dari tag html, saya mendapatkan simbol = di akhir setiap baris dan juga   ; , < ditampilkan. Bagaimana cara mengatasinya.

Teks yang diekstraksi:

Yang terhormat pertama, Kami semua di GenWatt senang memiliki xyz sebagai pelanggan. Saya ingin memperkenalkan diri saya sebagai Manajer Akun Anda. Jika Anda = mempunyai pertanyaan, jangan ragu untuk menghubungi saya di atau mengirim email kepada saya di ash= [email protected]. Anda juga dapat menghubungi GenWatt di nomor berikut: Utama: 810-543-1100Penjualan: 810-545-1222Layanan & Dukungan Pelanggan: 810-542-1233Faks: 810-545-1001Saya yakin GenWatt akan melayani Anda dengan baik dan berharap dapat melihat kami hubungan=


person Ashok kumar Ganesan    schedule 08.12.2016    source sumber
comment
findAll('p') mengembalikan daftar dengan semua '‹p...›' di HTML Anda. Anda bisa mendapatkan semua konten 'p dengan [p.getText() for p in parsedContent.findAll('p')] atau semua konten dengan cara ini: content = '\n'.join([p.getText() for p in parsingContent.findAll('p')])   -  person GustavoIP    schedule 08.12.2016
comment
untuk paragraf di parsedContent.findAll('p'): value = paragraf.text nilai cetak seperti ini kan Saya tidak mengerti konten yang Anda sebutkan   -  person Ashok kumar Ganesan    schedule 08.12.2016
comment
Cara mengurai atau cara menggantinya dengan ‹spasi›   -  person Ashok kumar Ganesan    schedule 08.12.2016


Jawaban (1)


Mari kita periksa hasil soup.findAll('p')

python -i test.py
----------
import requests
from bs4 import BeautifulSoup

bodytext = requests.get("https://en.wikipedia.org/wiki/Earth").text
parsedContent = BeautifulSoup(bodytext, 'html.parser')

paragraphs = soup.findAll('p')
----------

>> type(paragraphs)
<class 'bs4.element.ResultSet'> 
>> issubclass(type(paragraphs), list) 
True # It's a list

Bisakah kamu melihat? Ini adalah daftar semua paragraf. Jika Anda ingin mengakses kontennya, Anda perlu mengulangi daftar atau mengakses elemen dengan indeks, seperti daftar biasa.

>> # You can print all content with a for-loop
>> for p in paragraphs:
>>     print p.getText()
Earth (otherwise known as the world (...)
According to radiometric dating and other sources of evidence (...)
...    

>> # Or you can join all content
>> content = []
>> for p in paragraphs:
>>     content.append(p.getText())
>> 
>> all_content = "\n".join(content)
>>
>> print(all_content)
Earth (otherwise known as the world (...) According to radiometric dating and other sources of evidence (...)

Menggunakan Pemahaman Daftar kode Anda akan terlihat seperti:

parsedContent = BeautifulSoup(bodytext)
body = '\n'.join([p.getText() for p in parsedContent.findAll('p')]

Ketika saya menggunakan

body = parsedContent.find('p').getText()

Itu mengambil baris pertama konten dan tidak mencetak baris sisanya.

Lakukan parsedContent.find('p') persis sama dengan melakukan parsedContent.findAll('p')[0]

>> parsedContent.findAll('p')[0].getText() == parsedContent.find('p').getText()
True
person GustavoIP    schedule 08.12.2016
comment
Saat mengekstrak semua paragraf, Di sela-sela baris saya mendapatkan cara menghindari ini atau cara menggantinya dengan ‹spasi› - person Ashok kumar Ganesan; 09.12.2016