Pencocokan Pola Regex di Awal String dengan BeautifulSoup

Saat ini saya sedang mencari cara untuk melakukan pencocokan pola melalui regex di awal nama kelas HTML. Pola yang saya coba cocokkan adalah:

"col-xs-.*"

Dua contoh kelas di halaman HTML adalah:

<div class="col-xs-12 col-sm-12 col-lg-12">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3">

Tujuannya adalah untuk hanya mencocokkan nama kelas di atas, karena sebenarnya dimulai dengan "col-xs-.*", itulah yang saya cari. Dengan menggunakan pencocokan regex saya saat ini, sepertinya saya tidak dapat memilih nama kelas ini. Saat ini saya mencoba mencocokkan menggunakan pola regex berikut:

regex = re.compile('^col-xs-.*$')
soup.find_all("div", class_ = regex)

Sayangnya pola ini juga mencetak nama kelas kedua (di mana "col-xs-.*" muncul di tengah dan bukan hanya di awal). Semoga ada yang punya solusi untuk masalah ini.


person Menno Van Dijk    schedule 20.07.2019    source sumber
comment
.* cocok hingga akhir string. Coba \bcol-xs-\d+\b   -  person The fourth bird    schedule 20.07.2019
comment
@Thefourthbird Sayangnya solusi Anda sepertinya tidak berhasil. Dan apakah penting bahwa .* cocok hingga akhir string? Yang saya butuhkan hanyalah polanya muncul di awal string, sisanya yang terjadi setelahnya menurut saya tidak terlalu penting.   -  person Menno Van Dijk    schedule 20.07.2019


Jawaban (3)


Saya pikir Anda ingin attribute = value pemilih css yang dimulai dengan ^ operator untuk menentukan string awalan yang akan ditemukan di atribut kelas.

soup.select('[class^="col-xs-"]')

Contoh:

from bs4 import BeautifulSoup as bs

html = '''
<div class="col-xs-12 col-sm-12 col-lg-12">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3">
'''
soup = bs(html, 'lxml')
classes = [' '.join(item['class']) for item in soup.select('[class^="col-xs-"]')]
print(classes)
person QHarr    schedule 20.07.2019

Saya menduga ungkapan ini mungkin mengekstraksi kelas-kelas yang diinginkan:

import re

regex = r"[\"']\s*(\bcol-xs-[0-9]+\b[^\"']+?)\s*[\"']"

test_str = """

<div class="col-xs-12 col-sm-12 col-lg-12"><div class="  col-xs-12 col-sm-12 col-lg-12  ">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3"><div class="col-xs-12 col-sm-12 col-lg-12">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3">

"""

print(re.findall(regex, test_str, re.MULTILINE | re.IGNORECASE))

Keluaran

['col-xs-12 col-sm-12 col-lg-12', 'col-xs-12 col-sm-12 col-lg-12', 'col-xs-12 col-sm-12 col-lg-12']

Ekspresi tersebut dijelaskan di panel kanan atas regex101.com, jika Anda ingin menjelajahi/ menyederhanakan/memodifikasinya, dan di tautan ini, Anda dapat melihat bagaimana kecocokannya dengan beberapa sampel masukan, jika Anda mau.

person Emma    schedule 20.07.2019

Jika Anda ingin menemukannya tanpa supe cantik, inilah caranya.
Semua tag div dengan atribut kelas dengan col-xs- di awal nilai:

Termasuk pemangkasan spasi.

r"(?i)<div(?=(?:[^>\"']|\"[^\"]*\"|'[^']*')*?(?<=\s)class\s*=\s*(?:(['\"])\s*(col-xs-(?:(?!\1)[\S\s])*?)\s*\1))\s+(?:\"\S\s]*?\"|'\S\s]*?'|[^>]*?)+>"

https://regex101.com/r/rsXqI9/1

Diformat:
Nilai kelas ada di grup 2.

 (?i)
 < div 
 (?=
      (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
      (?<= \s )
      class \s* = \s* 
      (?:
           ( ['"] )                      # (1)
           \s* 
           (                             # (2 start)
                col-xs-

                (?:
                     (?! \1 )
                     [\S\s] 
                )*?
           )                             # (2 end)
           \s* 
           \1 
      )
 )
 \s+ 
 (?: " \S\s ]*? " | ' \S\s ]*? ' | [^>]*? )+
 >
person Community    schedule 20.07.2019