【问题标题】:python url fetch help - regexpython url获取帮助 - 正则表达式
【发布时间】:2009-12-14 07:15:35
【问题描述】:

我有一个网站,上面有 <a href="http://www.example.com?read.php=123"> 之类的链接,谁能告诉我如何使用 python 获取此类链接中的所有数字(在本例中为 123)?我不知道如何构建正则表达式。提前致谢。

【问题讨论】:

  • 谢谢大家的回答

标签: python regex


【解决方案1】:
import re
re.findall("\?read\.php=(\d+)",data)

【讨论】:

    【解决方案2】:

    “如果你有问题,决定使用正则表达式,现在你有两个问题......”

    如果您正在阅读一个特定的网页并且您知道它的格式,那么正则表达式就可以 - 您可以使用 S. Mark 的答案。要解析特定链接,您可以使用 Kimvai 的答案。但是,要从页面中获取所有链接,最好使用更严肃的东西。您提出的任何正则表达式解决方案都会有缺陷,

    我推荐mechanize。如果您注意到,Browser 类有一个 links 方法,它可以获取页面中的所有链接。它的额外好处是能够为您下载页面 =)。

    【讨论】:

      【解决方案3】:

      无论链接的格式如何(例如,有些看起来像 <a href="foo=123"/> 而有些看起来像 <A TARGET="_blank" HREF='foo=123'/>),这都会起作用。

      import re
      from BeautifulSoup import BeautifulSoup
      soup = BeautifulSoup(html)
      p = re.compile('^.*=([\d]*)$')
      for a in soup.findAll('a'):
         m = p.match(a["href"])
         if m:
            print m.groups()[0]
      

      【讨论】:

        【解决方案4】:

        虽然其他答案有点正确,但您可能应该改用 urllib2 库;

        from urllib2 import urlparse
        import re
        urlre = re.compile('<a[^>]+href="([^"]+)"[^>]*>',re.IGNORECASE)
        links = urlre.findall('<a href="http://www.example.com?read.php=123">')
        for link in links:
            url = urlparse.urlparse(link)
            s = [x.split("=") for x in url[4].split(';')]
            d = {}
            for k,v in s:
                d[k]=v
            print d["read.php"]
        

        它不像上面的一些那么简单,但保证即使使用更复杂的 url 也能工作。

        【讨论】:

        • 不需要正则表达式来查找整个字符串。只需使用“in”运算符即可。其实regex是没有必要的
        • 您不需要正则表达式来“查找”字符串。要GET 字符串的一部分,您必须使用可以表达要获取和查找的内容。此外,如果您看到 HTML 语法,“href”并不是“a”标签唯一可能的属性,它不必是最后一个或第一个。正则表达式将匹配所有有效的“a”标签。
        • 你也应该用 IGNORECASE 编译你的 re
        【解决方案5】:

        /[0-9]/

        这就是你想要的正则表达式语法

        参考见

        http://gnosis.cx/publish/programming/regular_expressions.html

        【讨论】:

        • 不是很有帮助,因为这仅适用于一般情况,而且 /[0-9]/ 仅匹配单个数字(即在斜线之间),因此答案也不正确。正确的语法在 S.Mark 的回答中。
        【解决方案6】:

        一个不需要正则表达式的方法

        >>> s='<a href="http://www.example.com?read.php=123">'
        >>> for item in s.split(">"):
        ...     if "href" in item:
        ...         print item[item.index("a href")+len("a href="): ]
        ...
        "http://www.example.com?read.php=123"
        

        如果你想提取数字

        item[item.index("a href")+len("a href="): ].split("=")[-1]
        

        【讨论】:

        • 没有真正回答问题,巴哈想提取数字,而不是链接
        • 我相信我没有义务提供完整的解决方案。如果 SO 有这个政策,那就和做人家作业一样(如果伪装成一个)什么的。
        • 没错,你没有义务回答这个问题 - 但 SO 政策是评论投票,这就是为什么我指出你的回答并没有真正解决问题,只是部分问题.
        • SO 中的很多答案也不能完全解决问题。你要对他们每个人都投反对票吗?如果我的回答完全是另一个星球,那么我可以投反对票。但是,如果我朝着正确的方向前进,就不需要投反对票。
        猜你喜欢
        • 2011-11-02
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-30
        • 2018-11-05
        • 2023-03-26
        相关资源
        最近更新 更多