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

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

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*< /strong> Ez tartalmazza az első szögletes zárójelet ( << /strong>) 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.