【问题标题】:Python How to get a specific code in website using rePython如何使用re获取网站中的特定代码
【发布时间】:2016-11-10 00:36:39
【问题描述】:

我正在尝试制作 python 挑战。 http://www.pythonchallenge.com/pc/def/ocr.html 好的。我知道,我可以将源代码中的代码复制粘贴到 txt 文件中并制作类似的东西,但我想从网上获取它以提高自己。 (+我已经做过了)我试过了

re.findall(r"<!--(.*?)-->,html)

但它什么也得不到。 如果你想要我的完整代码在这里:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests,re
link = "http://www.pythonchallenge.com/pc/def/ocr.html"
x = requests.get(link)
codes = re.findall(r"<!--(.*)-->",str(x.content))
print codes 

我也尝试过这样:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests,re
link = "http://www.pythonchallenge.com/pc/def/ocr.html"
x = requests.get(link)
codes = re.findall("<!--\n(.*)\n-->",str(x.content))
print codes 

现在它找到了文本,但仍然无法得到那个混乱:(

【问题讨论】:

    标签: python html regex python-2.7 web


    【解决方案1】:

    我会使用 HTML 解析器。您可以在 HTML 中使用BeautifulSoup find comments

    工作代码:

    import requests
    from bs4 import BeautifulSoup, Comment
    
    
    link = "http://www.pythonchallenge.com/pc/def/ocr.html"
    response = requests.get(link)
    
    soup = BeautifulSoup(response.content, "html.parser")
    
    code = soup.find_all(text=lambda text: isinstance(text, Comment))[-1]
    print(code.strip())
    

    【讨论】:

    • 我尝试使用 bs4,但控制 bs4 太难了 :( 而且我可能是 python 新手,所以我基本无法理解 lambda。你能做一个函数吗?
    • @Dr.UK 好吧,如果你有 HTML 源代码要解析,你通常是 should not be using regular expressions。至于你的问题,lambda 只是编写函数的一种简短方法。在这种情况下,您很少需要在 BeautifulSoup 中传递函数,BeautifulSoup 是一个非常方便且易于使用的库。希望对您有所帮助。
    • @Dr.UK,如果你觉得 bs4 太难控制,那么祝你好运,嵌套元素和正则表达式。
    【解决方案2】:

    不知道你所说的“那个烂摊子”是什么意思。您应该在这篇文章中包含挑战的所有详细信息,而不是将用户链接到 pythonchallenge 帖子。

    无论哪种方式,如果您将正则表达式设置为单行模式 //s,那么点字符 . 也应该匹配换行符 /n。这避免了您的正则表达式中的\n(.+)\n 构造,这可能会解决您的问题。

    这是link to a working regex example

    这是修改后的python 2.7代码:

    #!/usr/bin/python
    import requests, re
    link = "http://www.pythonchallenge.com/pc/def/ocr.html"
    x = requests.get(link)
    codes = re.findall("<!--(.*?)-->", str(x.content), re.S)
    print codes[1]
    

    注意re.S(.*?)codes[1] 的修改。

    • re.S//s 的 python 标志
    • (.*?) 使 * 量词非贪婪
    • codes[1] 打印在 HTML cmets 中找到的第二组内容(因为 findall(..) 匹配 2 并返回两组内容的数组)。

    【讨论】:

    • 请提供一个python2.7的例子。
    • 在网站中,他们介绍了名为“混乱”的代码,您也不需要帐户即可访问该网站。顺便说一句,感谢您的回答。
    • 答案是否适合您的追求?它似乎对我有用。
    • 我也知道提出问题是不好的,但你能解释一下 (.*?) 是不是像“Get everything here”这样的前缀?
    【解决方案3】:

    你可以解决:

    codes = re.findall("/<!--(.*?)-->/s",str(x.content))
    

    “s”用空格和断线查找

    【讨论】:

      猜你喜欢
      • 2023-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 2020-08-02
      • 2015-12-22
      • 1970-01-01
      • 2011-03-13
      相关资源
      最近更新 更多