【问题标题】:Regular Expression Query Python正则表达式查询 Python
【发布时间】:2012-11-15 04:38:58
【问题描述】:

我正在尝试编写一个脚本来抓取一个网站,并且正在使用这个 (http://www.theericwang.com/scripts/eBayRead.py)。

然而,我想用它来抓取除 ebay 以外的网站,并根据我的需要进行定制。

我对 python 还很陌生,并且经验有限。

我不确定这条线能实现什么。

for url, title in re.findall(r'href="([^"]+).*class="vip" title=\'([^\']+)', lines):

有人可以指点一下吗?

如果我将它移植到其他网站,还有什么需要考虑的吗?

【问题讨论】:

标签: python regex screen-scraping


【解决方案1】:

通常,最好使用 BeautifulSoup 之类的库来解析 HTML,它几乎可以为您处理所有繁重的工作,从而为您提供更直观的代码。另外,请阅读下面@Tadeck 的链接 - 如果可以避免正则表达式和 HTML,则不应混合使用(轻描淡写)。

至于您的问题,该行使用称为“正则表达式”的东西来查找文本(在本例中为 HTML)中的匹配模式。 re.findall() 是一个返回列表的方法,所以如果我们只关注它:

re.findall(r'href="([^"]+).*class="vip" title=\'([^\']+)', lines):

r 表示以下将被解释为“原始”,这意味着反斜杠等字符将按字面解释。

href="([^"]+)

括号表示一个组(我们在匹配中关心的内容),[^"]+ 表示“匹配任何不是引用的内容”。正如您可能猜到的那样,该组将返回链接的 URL。

.*class="vip"

.* 匹配任何东西(嗯,几乎任何东西)0 次或多次(这里可能包括其他标签、链接的结束引号、空格等)。 class="vip" 没什么特别的 - 它只是需要出现。

title=\'([^\']+)', lines):

在这里你会看到一个转义的引用,然后是我们上面看到的另一个组。这一次,我们捕获了title 标记后两个撇号之间的任何内容。

这样做的最终结果是您正在遍历所有匹配项的列表,这些匹配项看起来类似于(my_matched_link, my_matched_title),它们将被传递到for url, title,然后进行进一步处理。

【讨论】:

    【解决方案2】:

    我不确定这是否会回答您的问题。但是你可以考虑 scrapy: http://scrapy.org 来抓取各种网站。这是一个很好的基础架构,提供了很大的灵活性,并且很容易根据某些特定需求进行定制。

    【讨论】:

      【解决方案3】:

      正则表达式不利于解析 HTML

      以上是我想与您交流的主要思想。对于为什么,请参阅这个问题:RegEx match open tags except XHTML self-contained tags

      简而言之,HTML 可以作为文本进行更改(例如,可以添加新属性,可以更改属性顺序,或者可能会引入一些其他更改),但它会产生与 web 解释的完全相同的 HTML浏览器,同时完全破坏你的脚本。

      应该使用专门的 HTML 解析器或网络爬虫来解析 HTML。当差异变得重要时,他们知道差异。

      用什么来抓取?

      有多种解决方案,但最著名的解决方案之一是:ScraPy。试试吧,你可能会爱上它。

      【讨论】:

      • 哈,正准备将该链接粘贴到我的答案中:)
      • @RocketDonkey: 就这样吧,我不拥有这个链接的版权;)实际上,这个问题是关于 SO 的第 9 个问题,投票数最多,所以希望它广为人知,并减少关于“为什么正则表达式不适用于 HTML”或“我应该使用正则表达式来解析 HTML”的问题:)
      • 哈,好点子 - 我认为,每当我想到/听说将正则表达式与 HTML 结合使用时,我认为仅凭这个答案就会产生身体反应。也让我每次都发笑:)
      猜你喜欢
      • 2020-10-15
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2021-08-18
      • 2017-10-10
      相关资源
      最近更新 更多