Wyrażenia regularne

0

Mam taki kod:

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 :(

0

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

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.

1

.*\d.*

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!

1

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

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 :(

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:

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.

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).

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.

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

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

0

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

1

Poczytaj coś o xpath.

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ę:

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ę !

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1