【问题标题】:Parsing HTML with str.split in Python在 Python 中使用 str.split 解析 HTML
【发布时间】:2016-08-27 21:08:19
【问题描述】:

我正在解析一个带有请求模块的网站,并且我试图在不使用 BeautifulSoup 的情况下获取标签内的特定 URL(但一个数据表,因为标签被多次使用)。这是我要解析的部分代码:

<td class="notranslate" style="height:25px;">
    <a class="post-list-subject" href="/Forum/ShowPost.aspx?PostID=80631954">
        <div class="thread-link-outer-wrapper">
            <div class="thread-link-container notranslate">
                Forum Rule: Don&#39;t Spam in Any Way
            </div>

我正在尝试获取标签内的文本:

/Forum/ShowPost.aspx?PostID=80631954

问题是,因为我正在解析一个论坛站点,所以这些分隔标签有多种用途。我想使用类似下面的代码使用 string.split 检索帖子 URL 表:

htmltext.split('<a class="post-list-subject" href="')[1].split('"><div class="thread-link-outer-wrapper">')[0]

HTML 代码中没有任何内容表明页面上的帖子编号,只有链接。

【问题讨论】:

  • 要解析 HTML,请使用 HTML 解析器;这就是它们的设计目的。
  • @ScottHunter 我知道我可以使用 HTML 解析器,但我不想为没有那个模块就可以完成的小事情导入一个大模块。从长远来看,它更有效,执行时间也是如此。我现在拥有的代码会遍历这些论坛帖子的 PAGES 并收集此类数据。
  • 然而,你在这里,需要帮助。如果你只是做简单的解析,那么你可能只需要一个简单的解析器,或者只是一个更大的解析器的一部分。当存在专门为此类任务构建的现有工具时,您不仅在重新发明轮子,而且还在请求其他人帮助您这样做。
  • 正如我在个人资料中所说,在优化之前先测量。在担心几毫秒的运行时间之前,先担心用胶带构建假 HTML 解析器的麻烦。

标签: python string html-parsing


【解决方案1】:

考虑使用Beautiful Soup。它会让你的生活轻松很多。注意解析器的选择,以便您可以在适合您的任务的速度和宽松度之间取得平衡。

【讨论】:

  • 我在问题中指定我不想为小事使用大模块。请参阅我对@ScottHunter 的评论。
【解决方案2】:

在我看来,有更好的方法来做到这一点。即使您不想使用 BeautifulSoup,我也会倾向于使用正则表达式。但是,该任务绝对可以使用您想要的代码来完成。这是一种使用列表推导式的方法:

 results = [chunk.split('">')[0] for chunk in htmltext.split('<a class="post-list-subject" href="')[1:]]

我尝试将其建模为尽可能接近您的基本代码,但我确实简化了其中一个拆分参数以避免空格问题。

如果正则表达式是公平的游戏,你可以这样做:

import re
target = '<a class="post-list-subject" href="(.*)">'
results = re.findall(target, htmltext)

【讨论】:

    【解决方案3】:

    在不确定瓶颈的情况下尝试进行预优化似乎真的很冒险,那就是 html 解析。如果您担心性能,为什么不使用 lxml?模块导入几乎从来都不是瓶颈,这听起来像是在自找麻烦。

    也就是说,从技术上讲,这将满足您的需求,但从长远来看,它并没有比使用像 lxml 这样的 HTML 解析器更高效。显式避免使用 HTML 解析器也可能会大大增加您的开发时间,因为您要找出晦涩难懂的字符串操作 sn-ps,而不是仅仅使用通过 HTML 免费获得的漂亮树结构。

    strcleaner = lambda x : x.replace('\n', '').replace(' ', '').replace('\t', '')
    S = strcleaner(htmltext)
    S.split(strcleaner('<a class="post-list-subject" href="'))[1].split(strcleaner('"><div class="thread-link-outer-wrapper">'))[0]
    

    您发布的代码的问题是空格和换行符也是字符。

    【讨论】:

      猜你喜欢
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多