Wyrażenia regularne

Wyrażenia regularne
KD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:53
0

Mam taki kod:

Kopiuj
import requests as req
from bs4 import BeautifulSoup
import re

def mf_czytanie_pliku_URL(czytaj_url):
    r = req.get(czytaj_url)
    r.encoding = 'utf-8'

    return r.text


pobrana_Strona = mf_czytanie_pliku_URL('https://allegro.pl/oferta/plyta-gumowa-wykladzina-mata-3-mm-metro-guma-9549970450')

soup = BeautifulSoup(pobrana_Strona,'html.parser', multi_valued_attributes=None)
soup.encode ( "utf8" )

#  vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

#  Treść oryginalna
strona_Tresc = soup.find(attrs={'class':'_1h7wt _1l8iq _2d49e_1NgnH'})
print(' Treść (oryginalna):  ---------------------------------')
print(strona_Tresc)
print()

#  Treść w wierszach
strona_TrescWiersze = strona_Tresc.prettify()
print('  Treść w wierszach:   --------------------------------')
print(strona_TrescWiersze)
print()

# Wycięcie tagów HTML
strona_TrescBezHTML = re.sub(r'\s*\<.*\>', '', strona_TrescWiersze)
print('     Treść bez HTML:   --------------------------------')
print(strona_TrescBezHTML)
print()

# Pobieramy wiersze z cyframi '(.)*\s*[(0-9)]+\s*(.)*'
strona_TrescZapisac = re.findall(r'(.)*\s*[(0-9)]+\s*(.)*', strona_TrescBezHTML, flags=re.MULTILINE)
print('TRESC do zapisania: ', strona_TrescZapisac)

Nie czaję, czemu nie potrafię wyciągnąć wierszy zawierających cyfry :(


Niech wiek nie ogranicza chęci poszerzenia horyzontów!
edytowany 2x, ostatnio: KaDwa
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
0

A moglbys dokladniej opisac co chcesz matchowac?
Wiersz, ktory zawiera chociaz jedna cyfre?


λλλ
KD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:53
0

Chce wyciągnąć wszystkie wiersze które posiadają cyfry, do dalszej już ręcznej analizy :) Załącznik przedstawia wynik tego czego szukam .

Nie udało mi się znaleźć klucza na jedne wyszukanie, bo spektrum możliwości przedstawiania wymiarów jest bardzo różnorodne.


Niech wiek nie ogranicza chęci poszerzenia horyzontów!
edytowany 1x, ostatnio: KaDwa
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
1

.*\d.*


λλλ
KD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:53
0

@stivens:
Wiedziałem że muszę od nowa grzebnąć. Zacząłem powoli wariować. Zawiesiłem się zakładając że klucz jest poprawny. Budowałem go przy pomocy https://regex101.com/ i chyba za bardzo go skomplikowałem, bo powstawał etapami i za bardzo zmutował do zadania, dla którego został stworzony.

Ponowne dzięki!


Niech wiek nie ogranicza chęci poszerzenia horyzontów!
stivens
Az sie regula KISS nasuwa ;) nie ma sprawy
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
1

@stivens: Jak już piszesz herezje w stylu .* to chociaż wytłumacz na czym to polega, bo zaraz koledze komputer wybuchnie.


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
stivens
Jak masz jakies uwagi to po prostu je napisz ¯_(ツ)_/¯
KD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:53
0

@PerlMonk: Ale zachodzę w głowę, czemu ten mój klucz nie zadziałał. Wykrywał więcej bo z nawiasami na stronie https://regex101.com/ a python zupełne dziwactwa :(


Niech wiek nie ogranicza chęci poszerzenia horyzontów!
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
1

@KaDwa: Jeśli dopasowujesz wiersz wyrażeniem .* to czasem diakrytyka w tekście może się nie załapać, bo jest w innym kodowaniu, niż reszta skryptu. To normalne kiedy dane pochodzą z internetu. Kolejna sprawa to to, że ty chcesz tylko sprawdzić czy w wierszu są liczby - reszta znaków Cię nie obchodzi. Po co więc masz sprawdzać cały wiersz? Masz przykład:

Kopiuj
def main():
	tab = ['abc 123 def', 'ghi', 'jkl', 'mn 7', '444', 'opqr']
	numery = []

	for wiersz in tab:
		if (re.search('\d+?', wiersz)):
			numery.append(wiersz)

	print(numery)

Kolejna rzecz: tagi. Twoje wyrażenie \s*\<.*\> dopasuje Ci coś takiego w całości <tag>baba jaga</tag><dupa>jaga baba</dupa> - czyli wszystko od <tag do dupa>.
Zróbmy inaczej: \<\/?\w+?\> - to znajdzie tylko tagi. Skoro znalazłeś tag, to nie musisz szukać dalej.
W wyrażeniach regularnych chodzi o to, żeby szukać tylko tego, co nas interesuje. Rzeczy typu .* przydają się rzadko kiedy i niepotrzebnie obciążają procesor.


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
stivens
A jestes w stanie jakis benchmark dla tego konkretnego przypadku zrobic?
PerlMonk
Dałoby radę zrobić, ale to wymaga trochę analizy. Kilka próbek tekstu, różne flagi podane do funkcji itp., żeby pokazać jak to wszystko się różni. W wielu przypadkach na kilku MB tekstu różnica moze być mała.
stivens
A pytam dlatego, ze ostatnio tez myslalem ze regexy beda wolniejsze a jak strzelilem benchmark to... byly szybsze ¯_(ツ)_/¯
PerlMonk
To tak samo jakbyś powiedział, że każdy kod w C++ będzie wydajnieszy od każdego kodu w Javie. Wiesz, że bywa różnie i można napisać słaby kod w C++ a czasem JVM dokons dobrych optymalizacji.
KD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:53
0

@PerlMonk:
.* - dziękuję, będę się starał uważać - na razie piszę program tak aby działał i rozumiał co program robi (gorzej jak się zwiesi)
\<\/?\w+?\> nie działa w moim kodzie, ale świetnie działa na https://regex101.com/ (z małą uwagą, zostają puste wiersze).


Niech wiek nie ogranicza chęci poszerzenia horyzontów!
edytowany 1x, ostatnio: KaDwa
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
0

@KaDwa: jesli w tym momencie to działa to ok. Jeśli jednak kiedyś zadziała inaczej to wiesz, że ostrzegałem 🙃 . Każdy język moze inaczej używać silnika wyrażeń regularnych, bo typ string ma różną implementację. Sam w sobie opis wyrażeń będzie wszędzie podobny.


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
KD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:53
0

Dzięki jeszcze raz za uświadamianie mnie w mojej ułomności, ale apetyt rośnie w miarę jedzenia. Nie mogę sobie poradzić z jedną kwestią.

W zmiennej strona_Tresc chciałbym przy pomocy </*[biu]> usunąć tagi aby string ...<p><b>Parametry maty:</b></p><ul><li>Grubość:<b> 3 mm</b></li><li>Szerokość: <b>100 cm</b></li><li>Zakres temperatury pracy: -30 C +70 C</li>... Doprowadzić na samym końcu do ciągu: Grubość: 3 mm


Niech wiek nie ogranicza chęci poszerzenia horyzontów!
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
0

Mam wrazenie ze po prostu nie korzystasz w pelni z BeautifulSoup. Ostatnio korzystalem z tego ze 3 lata temu wiec szczegolow nie podam ale jestem przekonany ze istnieja tam metody do wyciagania tekstu bez znacznikow.

Takze zamiast regexy meczyc to chwilowo sio do dokumentacji bs:)

EDIT: chociazby tak https://www.crummy.com/software/BeautifulSoup/bs4/doc/#strings-and-stripped-strings


λλλ
edytowany 2x, ostatnio: stivens
KD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:53
0

Aż wstyd się przyznać, czytałem.
Ogranicza to do zastosowania tylko jednego wyrażenia regularnego, ale dalej nie rozwiązało mojego problemu.


Niech wiek nie ogranicza chęci poszerzenia horyzontów!
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około godziny
  • Postów:4937
1

Poczytaj coś o xpath.


KD
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:53
1

Aż wstyd się przyznać, czytałem. Jednak to dalej nie rozwiązało mojego problemu.

ale rozwiązałem problem tak, po wczytaniu pliku robię:

Kopiuj
pobrana_Strona= pobrana_Strona.replace('<b>', '')
pobrana_Strona= pobrana_Strona.replace('<i>', '')
pobrana_Strona= pobrana_Strona.replace('<u>', '')

i uzyskałem efekt na który liczyłem :)

Zaskoczył mnie efekt, bo podmienił nie tylko <b> ale i </b>

Dziękuję !


Niech wiek nie ogranicza chęci poszerzenia horyzontów!
edytowany 2x, ostatnio: KaDwa
PerlMonk
Czasem najprostsze rozwiązania są najlepsze :)
ledi12
  • Rejestracja:prawie 6 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Wrocław
0

@stivens: Bodajze .putrify() z tego co pamietam chociaz tez z czystego bs dawno nie korzystalem :D


Robię http response status cody w martwych ciągach

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.