【问题标题】:Python regex returning None while parsing a requests responsePython 正则表达式在解析请求响应时返回 None
【发布时间】:2020-01-11 09:01:58
【问题描述】:

我正在使用请求来下拉一个硬币矿工域列表,以便我可以将它们添加到防火墙阻止列表中:

'https://gitlab.com/ZeroDot1/CoinBlockerLists/blob/master/list_browser.txt?format=json&viewer=simple'

我想使用正则表达式来解析数据并仅提取域

正则表达式模式:

match = re.compile(r'(\"\\\\u003e)(.*?)(\\\\u003c\/)')

样本数据: """

lang=\"plaintext\"\u003echws.browsermine.com\u003c/span\u003e\n\u003cspan id=\"LC322\" class=\"line\" lang=\"plaintext\"\u003ecieh. mx\u003c/span\u003e\n\u003cspan id=\"LC323\" class=\"line\" lang=\"plaintext\"\u003eclgserv.pro\u003c/span\u003e\n\u003cspan id=\" LC324\" class=\"line\" lang=\"plaintext\"\u003eclickandbuy.review\u003c/span\u003e\n\u003cspan id=\"LC325\" class=\"line\" lang=\"plaintext \"\u003eclickandbuy.win\u003c/span\u003e\n\u003cspan id=\"LC326\" class=\"line\" lang=\"plaintext\"\u003eclickwith.bi\u003c/span\u003e\n\ u003cspan id=\"LC327\" class=\"line\" lang=\"plaintext\"\u003eclickwith.bid\u003c/span\u003e\n\u003cspan id=\"LC328\" class=\"line\" lang=\"plaintext\"\u003eclickwith.date\u003c/span\u003e\n\u003cspan id=\"LC329\" class=\"line\" lang=\"plaintext\"\u003ecliggi.dow​​nload\u003c/span \u003e\n\u003cspan id=\"LC330\" class=\"line\" lang=\"plaintext\"\u003eclod.pw\u003c/span\u003e\n\u003cspan id=\"LC331\" class= \"line\" lang=\"明文\"\u003ec Loudcdn.gd\u003c/span\u003e\n\u003cspan id=\"LC332\" class=\"line\" lang=\"plaintext\"\u003ecloudcdn.gdn\u003c/span\u003e\n\u003cspan id= \"LC333\" class=\"line\" lang=\"plaintext\"\u003ecloudcoins.co\u003c/span\u003e\n\u003cspan id=\"LC334\" class=\"line\" lang=\ "plaintext\"\u003ecloudflane.com\u003c/span\u003e\n\u003cspan id=\"LC335\" class=\"line\"

"""

我开始尝试使用将请求输出匹配为字符串

re.match(pattern, string)
re.search(pattern, string)
re.findall(pattern, string)

所有这些都返回 None 或空列表

这让我觉得这是我的正则表达式,但是当我使用 www.regex101.com 时,它匹配正确。我最初有 p = re.compile(r'(\"\\u003e)(.*?)(\\u003c/)'),最后没有转义的“/”。我添加了“/”所以它会匹配所有类型的正则表达式,而不仅仅是 python 正则表达式。

我尝试使用 response.content 并将正则表达式模式匹配更改为字节,但它也返回 None 或字节字符串的空列表。

我还尝试将请求响应写入文件,然后使用我的正则表达式模式解析文件,但这也返回 None。

这是我试过的代码:

    import requests
    import pprint
    import re
    requests.packages.urllib3.disable_warnings()
    url = 'https://gitlab.com/ZeroDot1/CoinBlockerLists/blob/master/list_browser.txt?format=json&viewer=simple'
    #regex_pattern = re.compile(r'\\u003e(.*?)\\\\u003c/')
    p = re.compile(r'(\"\\\\u003e)(.*?)(\\\\u003c\/)')

    r = requests.get(url, verify=False)
    data = r.text
    pprint.pprint(data)
    match = re.findall(p, data)
    print(match)

当我尝试将其粘贴到“显示一些代码”字段时,我的代码格式看起来很奇怪。希望这是有道理的

我的最终目标是通过匹配我的正则表达式的第 2 组来解析域。

任何帮助将不胜感激!

【问题讨论】:

  • 尝试删除不必要的分组和反斜杠:p = re.compile(r'\u003e(.*?)\u003c')p = re.compile(r'\\u003e(.*?)\\u003c')

标签: regex python-3.x python-requests


【解决方案1】:

你逃脱了你的转义字符,然后也逃脱了那些!

p = re.compile(r'(\"\\u003e)(.*?)(\\u003c\/)') 工作正常。

另外值得注意的是:如果你只想捕获域名,而不关心url的第一位和最后一位,你可以省略它们周围的捕获组,只得到你关心的结果。此外,快速查看数据,\u003e 不是唯一的(包含它的字符串不一定有域名),但每个包含 url 的字符串在域名前都有单词“plaintext”。添加这个看起来可以正确过滤名称。

p = re.compile(r'plaintext\\"\\u003e(.*?)\\u003c\/') - Try it here!

【讨论】:

  • 嗨尼克,谢谢您的回复!您提供的正则表达式不捕获 URL,这是您提供的正则表达式的输出: """ \n\u003cdiv class=\"file-content code js-syntax-highlight qa-file-content\"\u003e\ n\u003cdiv class=\"行号\"\u003e\n\u003ca class=\"diff-line-num\" 数据行号=\"1\" href=\"#L1\" id= \"L1\"\u003e\n\u003ci aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-link\"\u003e ""
  • 对不起,我没有意识到按回车会提交评论。
  • 不用担心。我现在正在查看 GitHub 数据——我马上准备好一个编辑过的正则表达式。您不能在 cmets 中添加换行符,但如果您想在不提交的情况下按 Enter,Shift+Enter 就是您要查找的内容。
  • 谢谢!这就是我一直在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多