html 正在解析 Python

html parsing Python

我有以下 HTML:

<div class="col-sm-8"
                data-pdf-class="column8">
                <a target='_blank' href='https://datacvr.virk.dk/data/visenhed?enhedstype=person&id=4003893917'>Tove Kjeldsen</a><br/>Lundevangsvej 19<br/>2900 Hellerup<br/>Ejerandel: 5-9,99%<br/>Kapitalklasse: B<br/>Erhvervelsesdato: 30.06.1996        <br/><br/>
<a target='_blank' href='https://datacvr.virk.dk/data/visenhed?enhedstype=person&id=4004146416'>Inge Lise Klastrup</a><br/>Ærøgade 5<br/>8000 Aarhus C<br/>Ejerandel: 5-9,99%<br/>Kapitalklasse: B<br/>Erhvervelsesdato: 30.06.1996        <br/><br/>
<a target='_blank' href='https://datacvr.virk.dk/data/visenhed?enhedstype=person&id=4003886026'>Asta Johanne Kjeldsen</a><br/>Meldskiftet 9<br/>6950 Ringkøbing<br/>Ejerandel: 5-9,99%<br/>Stemmeandel: 33,33-49,99%<br/>Kapitalklasse: A, B<br/>Erhvervelsesdato: 30.06.1996        <br/><br/>
ASTA OG HENRY KJELDSENS FAMILIEFOND<br/>c/o Henry Kjeldsen<br/> Enghavevej 17<br/>6950 Ringkøbing<br/>Ejerandel: 25-33,32%<br/>Stemmeandel: 50-66,66%<br/>Kapitalklasse: A, B<br/>Erhvervelsesdato: 30.06.1996        <br/><br/>
<a target='_blank' href='https://datacvr.virk.dk/data/visenhed?enhedstype=person&id=4000019274'>Jens Lykke Kjeldsen</a><br/>Tranmose 2<br/>6950 Ringkøbing<br/>Ejerandel: 5-9,99%<br/>Kapitalklasse: A, B<br/>Erhvervelsesdato: 30.06.1996        <br/><br/>
<a target='_blank' href='https://datacvr.virk.dk/data/visenhed?enhedstype=person&id=4000271454'>Anne Birte Kjeldsen</a><br/>Enghavevej 13<br/>6950 Ringkøbing<br/>Ejerandel: 5-9,99%<br/>Kapitalklasse: B<br/>Erhvervelsesdato: 30.06.1996        <br/><br/>
HENRY KJELDSEN. RINGKØBING TØMMERHANDEL A/S<br/>Enghavevej 17<br/>6950 Ringkøbing<br/>Ejerandel: 33,33-49,99%<br/>Kapitalklasse: B<br/>Erhvervelsesdato: 30.06.1996        <br/><br/>
    </div>

我正在尝试提取名称,但并非所有名称都有 'a' 标签。输出应该是:

等等...

虽然不完全清楚应该从 html 转储中解析哪些名称,但我发现这段特定的代码表现良好。

import re

matches_result_total = list()

with open("/path/to/dump.html", "r") as file:
    file = file.read()
    matches_temp1 = re.findall("<a.+>(.+)</a>", file, re.U)
    matches_temp2 = re.findall("<br/><br/>[\n]?([^<]+)<br/>", file, re.U)
    matches_result_total = matches_temp1 + matches_temp2

print(matches_result_total)

对我来说,这会产生结果:

['Tove Kjeldsen','Inge Lise Klastrup', 'Asta Johanne Kjeldsen', 'Jens Lykke Kjeldsen', 'Anne Birte Kjeldsen', 'ASTA OG HENRY KJELDSENS FAMILIEFOND', 'HENRY KJELDSEN. RINGKØBING TØMMERHANDEL A/S']

更新:

正如 alecxe 所说,在大多数情况下,使用正则表达式来解析 HTML 或任何复杂的结构化语言是疯狂的,但是,如果知道 html 的结构,就可以限制其范围正则表达式以避免死于可怕的死亡,正如 alecxe 在他提供的 link 中解释的那样。 :)

考虑到 html 这一段的结构,考虑到我对下面的代码所做的少量添加,我认为使用它应该是安全的。

import re

matches_result_total = list()

with open("/path/to/dump.html", "r") as file:
    file = file.read()
    matches_temp1 = re.findall("<br/><br/><a.+>(.+)</a><br/>", file, re.U)
    matches_temp2 = re.findall("<br/><br/>[\n]?([^<]+)<br/>", file, re.U)
    matches_result_total = matches_temp1 + matches_temp2

print(matches_result_total)

现在仅当给定的 html 转储以 2 条断行开始然后以 link 标记或文本继续时才匹配。