繁体   English   中英

Python模式匹配

[英]Python pattern matching

我目前正在将我的旧bash脚本转换为具有附加功能的Python脚本。 我已经能够完成大部分工作,但我在Python模式匹配方面遇到了很多麻烦。

在我之前的脚本中,我下载了一个网页并使用sed来获取我想要的元素。 匹配是这样完成的(对于我想要的其中一个值):

PM_NUMBER=`cat um.htm | LANG=sv_SE.iso88591 sed -n 's/.*ol.st.*pm.*count..\([0-9]*\).*/\1/p'`

它将匹配短语“olästaypm”后面的<span class="count"></span>中包含的数字。 我正在运行此标记的标记是:

<td style="padding-left: 11px;">
    <a href="/abuse_list.php">
        <img src="/gfx/abuse_unread.png" width="15" height="12" alt="" title="9  anmälningar" />
    </a>
</td>
<td align="center">
    <a class="page_login_text" href="/pm.php" title="Du har 3 olästa pm.">
        <span class="count">3</span>
</td>
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/blogg_latest.php" title="Du har 1 ny bloggkommentar">
        <span class="count">1</span>
</td>
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/user_guestbook.php" title="Min gästbok">
        <span class="count">1</span>
</td> 
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/forum.php?view=3" title="Du har 1 ny forumkommentar">
        <span class="count">1</span>
</td> 
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/user_images.php?user_id=162005&func=display_new_comments" title="Du har 1 ny albumkommentar">
        <span class="count">1</span>
</td> 
<td style="padding-left: 11px;" align="center">
    <a class="page_login_text" href="/forum_favorites.php" title="Du har 2 uppdaterade trådar i &quot;bevakade trådar&quot;">
        <span class="count">2</span>
</td>

我很犹豫发布这个,因为看起来我要求很多,但有人可以帮我解决一下用Python解析这个问题吗? 我一直在拉我的头发试图这样做,但正则表达式和我只是不匹配(原谅双关语)。 我花了最后几个小时在正则表达式上试验和阅读Python手册,但我似乎无法弄明白。

为了说清楚,我需要的是7个不同的表达式,用于匹配<span class="count"></span> 例如,我需要能够找到未读PM的数量(“olästafat”)。

你不会自己解析HTML。 您将使用python中构建的html解析器来解析html。

您可以使用lxml通过xpath轻松提取您正在查找的值

from lxml import html
page = html.fromstring(open("um.htm", "r").read())
matches = page.xpath("//a[contains(@title, 'pm.') or contains(@title, 'ol')]/span")
print [elem.text for elem in matches]

使用:

用正则表达式解析HTML是一种灾难。

使用正则表达式无法可靠地匹配HTML。 通常可以将一些适用于特定页面的内容拼凑在一起,但这是不可取的,因为即使对源HTML进行微妙调整也会使您的所有工作无效。 HTML只是具有比Regex能够描述的更复杂的结构。

正确的解决方案是使用专用的HTML解析器。 请注意,即使是XML解析器也无法满足您的需求,无论如何都不可靠。 有效的XHTML是有效的XML,但即使它非常相似,即使是有效的HTML也不是。 无论如何,有效的HTML / XHTML几乎不可能在野外找到。

有几种不同的HTML解析器可用:

  • BeautifulSoup不在标准库中,但它是最宽容的解析器,它可以处理几乎所有真实的HTML,它的设计完全符合您的要求。
  • HTMLParser包含在Python标准库中,但对于仅接受有效的HTML非常严格。
  • htmllib也在标准库中,但已弃用。

正如其他人所说,BeautifulSoup几乎肯定是您的最佳选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM