Saya mencoba menggunakan BS4 dengan regex di atribut value* di bawah ini:

all_attributes = [
 <s3><Cell value1="384.01"/></s3>,
 <s3><Cell value2="447.82"/></s3>,
 <s3><Cell value3="72.83"/></s3>,
 <s3><Cell value4="325.65"/></s3>,
 <s3><Cell value4="49.34"/></s3>,
 <s3><Cell Textbox4="filler"/></s3>,
 <s3><Cell Textbox4="filler"/></s3>
]

Ekspresi yang saya gunakan adalah:

[attribute.find_all("Cell", {re.compile(r'^value[0-9]$'): True})
for attribute in all_attributes]

Dengan harapan saya akan mendapatkan yang berikut:

[
 <s3><Cell value1="384.01"/></s3>,
 <s3><Cell value2="447.82"/></s3>,
 <s3><Cell value3="72.83"/></s3>,
 <s3><Cell value4="325.65"/></s3>,
 <s3><Cell value4="49.34"/></s3>
]

Namun saya mendapatkan daftar kosong. Jika saya mengganti re.compile(r'^value[0-9]$') dengan value1 atau value2 dll. Ini berfungsi seperti yang diharapkan, tetapi jelas tidak memberikan apa yang saya inginkan.

Saya kira menggunakan re.compile sebagai kunci yang dianggap tidak berfungsi, tetapi saya tidak begitu mengerti mengapa?

Bisakah seseorang menjelaskan dan membantu menemukan solusi untuk kasus penggunaan seperti itu?

1
Newskooler 29 Mei 2021, 00:09

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan fungsi lambda di .find_all + str.startswith:

from bs4 import BeautifulSoup

html_doc = """
 <s3><Cell value1="384.01"/></s3>,
 <s3><Cell value2="447.82"/></s3>,
 <s3><Cell value3="72.83"/></s3>,
 <s3><Cell value4="325.65"/></s3>,
 <s3><Cell value4="49.34"/></s3>,
 <s3><Cell Textbox4="filler"/></s3>,
 <s3><Cell Textbox4="filler"/></s3>
"""

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

x = soup.find_all(
    lambda tag: tag.name == "cell"
    and any(a.startswith("value") for a in tag.attrs)
)
print(x)

Cetakan:

[<cell value1="384.01"></cell>, 
 <cell value2="447.82"></cell>, 
 <cell value3="72.83"></cell>, 
 <cell value4="325.65"></cell>, 
 <cell value4="49.34"></cell>]

Atau menggunakan regex:

import re

r = re.compile(r"^value\d+")
x = soup.find_all(
    lambda tag: tag.name == "cell" and any(r.search(a) for a in tag.attrs)
)
1
Andrej Kesely 28 Mei 2021, 21:21