A HTML elemzése a releváns adatok webhelyről történő kinyerésének népszerű módja. Számos HTML-elemzési technika áll rendelkezésre, mindegyik eltérő bonyolultságú.
Az egyik a RegEx-en keresztül történik. Ez egy karaktersorozat, amely egy keresési mintát határoz meg egy adott szövegben.
Ez a cikk a HTML RegEx segítségével történő elemzésének lépéseit ismerteti, beleértve a mintakódokat és néhány bevált módszert, amelyeket tudnia kell.
Olvass tovább.
HTML elemzés reguláris kifejezéssel
A reguláris kifejezést (RegEx) gyakran használják bizonyos szövegláncok keresésére, kibontására vagy cseréjére nagyobb adattömegben, például HTML-ben.
Ez azonban erősebb és nagymértékben testreszabható. Az alábbiakban egy példa látható egy RegEx-mintára a címkék és azok tartalmának HTML-ben történő kiválasztásához:
<(\w+)\s*((^>)*)>(.*?)<\/\1>
Az egyes karaktersorozatok funkcióinak megismerése segít megérteni az adott mintát.
Íme a bontás:
<(\w+)\s* | Ez tartalmazza az első szögletes zárójelet (<) a nyitó címkéről. (\w+) megfelel egy vagy több szókarakternek a címke nevében. A \s* nulla vagy több szóköznek felel meg a címke neve után. |
((^>)*)> | ((^>)*) nulla vagy több olyan karakternek felel meg, amelyek nem zárószögletes zárójelek (>). A ^ szimbólum kivételt képez. * egy „mohó” egyezés az attribútumok és értékek rögzítésére. Az utolsó szögletes zárójel (>) bezárja a nyitó címkét. |
(.*?) | Ez egy nem mohó egyezés, amely rögzíti a címke tartalmát. |
\/\1> | Ez megegyezik a záró címkével az első rögzítési csoportra (\w+) való visszautalással a \1 használatával. A szimbólumok <\/ szó szerint rögzítik a záró címkét. Az utolsó szögletes zárójel (>) bezárja a záró címkét. |
A reguláris kifejezés a programozási nyelvtől függően változhat. A következő részben megtudhatja, hogyan hozhat létre HTML-elemzőt a RegEx segítségével Python-szkriptek használatával.
Hogyan használjuk a reguláris kifejezést a HTML elemzéséhez?
A RegEx különböző programozási nyelvekben használható, például JavaScript, C++ és C.
A Python natív módon támogatja a RegEx-et a re könyvtárat, amelyet ebben az útmutatóban fogunk használni
🎉 Érdekes tény: Tudja, hogy a webhelyek 2,1%-a JavaScriptet használ szerveroldali programozási nyelvként? Eközben a webhelyek kevesebb mint 0,1%-a használ C-t és C++-t. |
Mielőtt belevágna a tényleges Python-szkriptbe, próbáljon megszokni néhány RegEx-mintát.
Alapvető reguláris kifejezési minták a HTML-elemzéshez
Nem kell mindent megjegyezni a folyamat során. Az itt található alapvető RegEx-mintákat használhatja a HTML-tartalom elemzéséhez.
Vessen egy pillantást mindegyikre.
Az attribútumértékek egyeztetéséhez a következőket használhatja:
<\w+\s+(\w+)=(\'")((^\'")*)(\'")>
Az összes HTML megjegyzés kinyeréséhez használja:
<!--(.*?)-->
Az összes URL lekéréséhez a horgonyoktól futtassa a következőket:
<a(^>)*href=(\'")((^\'")*)(\'")(^>)*>
Ha az összes e-mailt HTML-fájlban szeretné megszerezni, írja be:
\b(A-Za-z0-9._%+-)+@(A-Za-z0-9.-)+\.(A-Za-z){2,}\b
Most itt az ideje, hogy továbblépjünk a Pythonban javasolt szkriptekre.
RegEx HTML-elemző beállítása Python használatával
Tegyük fel, hogy az összes URL-t ki szeretné bontani egy weboldalon belüli horgonycímkékből. A kód első része az importálásból áll majd reés urllib.request könyvtárak.
Mindkettő Python natív, így nem kell letölteni semmit. Ezzel kezdheted:
import re import urllib.request
A következő készlet dekódolja a kérést-választ UTF-8-ba. Azaz:
def get_anchor_urls(url): try: response = urllib.request.urlopen(url) html_content = response.read().decode('utf-8')
Ezután a mintaváltozó a horgonycímkék URL-címeinek lekéréséhez. A re.findall() függvény megtalálja az összes nem átfedő egyezést a kért HTML-tartalomban.
pattern = r'<a(^>)*href=(\'")((^\'")*)(\'")(^>)*>' anchor_tags = re.findall(pattern, html_content)
Lesz itt egy probléma. Ez a szkriptekből származó URL-eket is rögzíti.
Ennek megoldásához egy másik mintát kell hozzáadni az URL-ek szkriptcímkékből való rögzítéséhez és kiszűréséhez.
script_pattern = r'<script\b(^<)*(?:(?!<\/script>)<(^<)*)*<\/script>' anchor_urls = ( url for url in anchor_tags if not re.search(script_pattern, url))
Íme a kód a horgony URL-ek vagy hibaüzenetek visszaküldéséhez, ha a kérés sikertelen:
return anchor_urls except urllib.error.URLError as e: print('Error retrieving webpage:', e) return None
A kérelem elküldéséhez szükséges konkrét URL hozzárendeléséhez adja hozzá:
webpage_url="https://example.com/" urls = get_anchor_urls(webpage_url)
Végül nyomtassa ki az eredményeket a következő használatával:
if urls: print('Anchor URLs:') for url in urls: print(url)
Mindent összevetve így kell kinéznie:
import re import urllib.request def get_anchor_urls(url): try: response = urllib.request.urlopen(url) html_content = response.read().decode('utf-8') # Decode the response as UTF-8 # Regex pattern to match anchor tags and capture the URLs pattern = r'<a(^>)*href=(\'")((^\'")*)(\'")(^>)*>' # Exclude URLs from script tags using negative lookahead script_pattern = r'<script\b(^<)*(?:(?!<\/script>)<(^<)*)*<\/script>' # Find all anchor tags in the HTML content anchor_tags = re.findall(pattern, html_content) # Filter out URLs from script tags anchor_urls = ( url for url in anchor_tags if not re.search(script_pattern, url)) return anchor_urls except urllib.error.URLError as e: print('Error retrieving webpage:', e) return None # Example usage webpage_url="https://example.com/" urls = get_anchor_urls(webpage_url) if urls: print('Anchor URLs:') for url in urls: print(url)
A szkriptek bevitele után most már rendelkezik egy RegEx HTML elemzővel, amelyet használhat.
Megnézheti az adatelemző eszközöket is, amelyek segíthetnek automatizálni a folyamatot, így időt és erőfeszítést takaríthat meg saját elemzőjének elkészítéséhez.
A HTML-elemzés legjobb gyakorlatai
A folyamat nem ér véget egy saját elemző beállításával. Van még néhány dolog, amelyet emlékeznie kell a HTML-tartalom RegEx segítségével történő elemzésekor.
Ezek a következők:
1. Korlátozza a RegEx használatát egyszerű HTML-fájlokra
Bár erős, a RegEx nem teljesen alkalmas a HTML teljes összetettségének kezelésére.
Néhány legnépszerűbb webböngésző képes „törött” HTML-szkriptek megjelenítésére, és ez a RegEx problémája lehet.
Néhány fejlesztő szándékosan „törve” vagy rosszul felépített HTML-kódot hagy. Ez megnehezíti, hogy a RegEx megfeleljen a releváns elemeknek.
A beágyazott címkék párosítása is nagyon bonyolult. Az ezekhez igazodó speciális RegEx-minták létrehozása időigényes lehet, mivel sok próbálkozásra és hibára van szükség.
✅Pro-tip: Összetett HTML elemzésekor használhatja a BeautifulSoup Python könyvtárat. Egy másik lehetőség egy JavaScript HTML-elemző, amely Node.js-t használ a Cheerio-val. |
2. Használjon RegEx online tesztelőt
A RegEx-mintákkal a próbálkozásoknak és hibáknak nem kell a kód ismételt futtatásából fakadniuk. Vannak online tesztelők a RegEx mintákhoz, és ezek ingyenesek.
közül választhat RegExR vagy RegEx101. Mindkét eszköz segítségével tesztelheti a RegEx-mintákat a szövegbevitellel szemben, hogy javítsa vagy hibakereshesse őket.
Lehetővé teszik egy adott programozási nyelv kiválasztását is a kompatibilitás érdekében.
3. Tartsa tiszteletben a webhelyek általános szerződési feltételeit és a robots.txt fájlokat
Ez egy fontos szabály, amelyet mindig szem előtt kell tartania, hogy elkerülje a jogi problémákat a kaparás során.
A webhelyek szolgáltatási feltételei tartalmazhatnak előírásokat a platformjukon lévő adatok felelős felhasználására vonatkozóan. Ügyeljen arra, hogy ellenőrizze az egyes webhelyek általános szerződési feltételeit.
Másrészt a robot.txt fájlok tartalmazzák mindazokat az adatokat, amelyeket a weboldal nem enged lekaparni. Hozzáférési információkat kaphat, ha hozzáadja a robot.txt fájlt a webhely URL-jéhez.
Például:
https://www.example.com/robot.txt
A robot.txt-ben meghatározott szabályok megszegése valóban jogi problémákat jelenthet, ezért erre ügyeljen.
Következtetés
A RegEx csak az egyik módja a HTML-tartalom elemzésének. Bár ez egy hatékony módszer, akkor is elmaradhat az összetett HTML-fájlok kezelésekor.
A fenti lépések követésével elemezhet bármilyen HTML-anyagot. Ha azonban összetett HTML-lel foglalkozik, próbáljon ki más eszközöket, például a BeautifulSoup-ot vagy a Node.js-t a HTML-elemzéshez.
GYIK
-
Elemezheti az érvénytelen HTML-t a RegEx segítségével?
Igen ám, de nem ajánlott ezt megtenni. Ha RegEx-et használ az érvénytelen HTML elemzéséhez, akkor a szabálytalanság mértékétől függően néhány hiányzó információra számítson.
-
Hogyan használjuk a RegEx-et HTML-címkékben?
Hozzon létre egy RegEx-mintát, amely megfelel a kívánt HTML-címkének. Például a <(\w+)(^>)*> RegEx minta megfelel egy HTML nyitócímkének.
-
Használhatom a RegEx-et a Chrome-ban?
Igen. Használhatja a RegExet a Chrome DevToolsban, amikor a webhely forrásai között keres.