如何通过匹配字符串来提取Python中的父html标记

2024-05-21 05:29:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要通过匹配html中的字符串来提取html中的父标记。 (即) 我有许多原始的html源代码。每个源包含文本值“VIN:*”**和一些字符。此文本值(VIN:*)以各种格式放置在每个源中,如“<;ul>;”、“<;div>;”等。。在

然后我需要提取所有值以及“VIN:*”字符串。这意味着我需要得到它的父标记。在

例如

<div class="class1">

                            Stock Number:
                            Z2079
                            <br>
                            **VIN:
                            2T2HK31UX9C110701**
                            <br>
                            Model Code:
                            9424
                            <img class="imgcert" src="/images/Lexus_cpo.jpg">
</div>

这里有html源代码的“VIN”。与此类似,我有其他html源代码的VIN,格式也不同。在

这些值必须在Python中提取。在

有没有什么方法可以有效地通过匹配Python中的字符串来提取父标记?在


Tags: 字符串标记文本brltgtdiv源代码
3条回答

对于一个非常简单的任务,即分析字符串,而不是解析它(解析=构建文本的树表示),您可以:

文本

ss = '''
Humpty Dumpty sat on a wall
<div class="class1">
    Stock Number:
    Z2079
    <br>
        **VIN:
        2T2HK31UX9C110701**
    <br>
    Model Code:
    9424
    <img class="imgcert" src="/images/Lexus_cpo.jpg">
</div>

Humpty Dumpty had a great fall
<ul cat="zoo">
    Stock Number:
    ARDEN3125
    <br>
        **VIN:
        SHAKAMOSK-230478-UBUN**
    </br>
    Model Code:
    101
    <img class="imgcert" src="/images/Magana_cpo.jpg">
</ul>

All the king's horses and all the king's men
<artifice>
    <baradino>
        Stock Number:
        DERT5178
        <br>
            **VIN:
            Pandaia-67-Moro**
        <br>
        Model Code:
        1234
        <img class="imgcert" src="/images/Pertuis_cpo.jpg">
    </baradino>
    what what what who what
    <somerset who="maugham">
        Nothing to declare
    </somerset>
</artifice>

Couldn't put Humpty Dumpty again
<ending rtf="simi">
    Stock Number:
    ZZZ789
    <br>
        **VIN:
        0000012554-ENDENDEND**
    <br>
    Model Code:
    QS78-9
    <img class="imgcert" src="/images/Sunny_cpo.jpg">
</ending>

qsdjgqsjkdhfqjkdhgfjkqshgdfkjqsdjfkh''' 

代码:

^{pr2}$

结果

('div'          , 'class="class1"'         , '2T2HK31UX9C110701'      )
('ul'           , 'cat="zoo"'              , 'SHAKAMOSK-230478-UBUN'  )
('baradino'     , ''                       , 'Pandaia-67-Moro'        )
('ending'       , 'rtf="simi"'             , '0000012554-ENDENDEND'   )

re.DOTALL必须赋予点符号匹配换行符的能力(默认情况下,正则表达式模式中的点匹配除换行符之外的每个字符)

\\1是指定在被检查字符串的这个位置,必须有第一个组捕获的字符串的相同部分,即([^ >]+)

'(?!.+?<(?!br>)[^ >]+>.+?<br>.+?</\\1>)'是一个部分,它规定禁止在HTML元素的开始标记和结束标记之间遇到的第一个标记<br>之前找到除<br>之外的标记。
这一部分是捕捉VIM-part前最近的前一个标记<br>
如果此部分不存在,则正则表达式

regx = re.compile('<([^ >]+) ?([^>]*)>'
                  '.*?\*\*VIN:(.+?)\*\*.+?</\\1>',
                  re.DOTALL)

捕获以下结果:

('div'          , 'class="class1"'         , '2T2HK31UX9C110701'      )
('ul'           , 'cat="zoo"'              , 'SHAKAMOSK-230478-UBUN'  )
('artifice'     , ''                       , 'Pandaia-67-Moro'        )
('ending'       , 'rtf="simi"'             , '0000012554-ENDENDEND'   )

区别在于“技巧”而不是“巴拉迪诺”

我强烈建议在这方面使用BeautifulSoup;它为解析HTML提供了一些非常方便的功能。例如,在这两种情况下,我将如何查找包含“VIN”的每个文本节点:

soup = your_html_here
vins = soup.findAll(text = lambda(x): x.lower.index('vin') != -1)

从那里,您只需遍历该集合,获取每个节点的父节点,获取所述父节点的内容,然后根据需要对其进行解析:

^{pr2}$

对于不使用任何xml/html解析器的纯字符串版本,可以尝试正则表达式(re):

import re

html_doc = """ <div ...VIN ...  /div>"""

results = re.findall('<(.+>).*VIN.*+</\1', html_doc)

相关问题 更多 >