Saya memiliki elemen BS4 berikut:

from bs4 import BeautifulSoup

html_doc = """
    <l2 attribute2="Output"><s3><Cell cell_value2="384.01"/></s3></l2>, 
    <l1><s3 attribute1="Cost"><s4><Cell cell_value1="2314.37"/></s4></s3></l1>
"""

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

Saya ingin mengekstrak semua nilai atribut seperti ini:

["Output", "Cost"]

Pertanyaan saya adalah: Bagaimana saya bisa mencapai ini dengan regex re.compile(r'^attribute[0-9]$') dan dalam situasi di mana attribute* dapat menjadi situasi baik pada tag pertama (mis l2) atau l2) atau l2) atau Ini bisa "lebih dalam" seperti di s3 atau kedalaman arbitrer lainnya)?

Saya dapat melakukan ini jika atribut memiliki nama yang sama atau jika mereka berada di tingkat kedalaman yang sama dengan nama yang berbeda - tetapi tidak keduanya.

1
Newskooler 29 Mei 2021, 01:27

1 menjawab

Jawaban Terbaik
import re
from bs4 import BeautifulSoup

html_doc = """
    <l2 attribute2="Output"><s3><Cell cell_value2="384.01"/></s3></l2>, 
    <l1><s3 attribute1="Cost"><s4><Cell cell_value1="2314.37"/></s4></s3></l1>
"""

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

r = re.compile(r"^attribute\d+")

out = []
for tag in soup.find_all(lambda tag: any(r.search(a) for a in tag.attrs)):
    for attr, value in tag.attrs.items():
        if r.search(attr):
            out.append(value)

print(out)

Cetakan:

['Output', 'Cost']
1
Andrej Kesely 28 Mei 2021, 22:33