Hogyan lehet HTML-t elemezni a reguláris kifejezéssel?

Peter

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

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

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

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

A szerzőről

Peter, az eOldal.hu tapasztalt SEO szakértője és tartalomgyártója. Több mint 10 éve foglalkozik keresőoptimalizálással és online marketinggel, amelyek révén számos magyar vállalkozás sikerét segítette elő. Cikkeiben részletes és naprakész információkat nyújt az olvasóknak a legfrissebb SEO trendekről és stratégiákról.