首页 > 解决方案 > 正则表达式只识别一半时间的引号

问题描述

我最近创建了一个非常基本的正则表达式(它是新的),它检测 javascript 文件的所有字符串:

with open("file.js", "r", encoding="UTF-8") as file:
    re.findall(r"(\".+\"|\'.+\')", file.read())

当我创建我的服装 js 文件时,这非常有效。一旦我开始尝试使用网络抓取,它就不再起作用了。

在 HTML 之后:

<html>
  <body>
    <script src="/modules.cb8e9af2c2709a34b49b.js"></script>
    <script src="/watch.4c4d39803b119ef010a3.js"></script>
    <script src="/common.acad5df36574c2182d15.js"></script>
    <script src="/reward4823ace7ccd.js"></script>
    <script src="/polyfills.2b2696c6c54a9388e1d4.js"></script>
    <script src="/index.a5be217e620cedc065e5.js"></script>
  </body>
</html>   

会输出

['/modules.cb8e9af2c2709a34b49b.js"></script><script src="/watch.4c4d39803b119ef010a3.js">
</script><script src="/common.acad5df36574c2182d15.js"></script><script src="/reward4823ace7ccd.js"> 
</script><script src="/polyfills.2b2696c6c54a9388e1d4.js"></script><script src="/index.a5be217e620cedc065e5.js']

当我通过访问真实的网站代码时

r = requests.get(link)
re.findall(r"(\".+\"|\'.+\')", str(BeautifulSoup(r.text, "html.parser")))

但是当我将html写入我的costum文件并使用第一个代码尝试时,它会正确输出

['/modules.cb8e9af2c2709a34b49b.js', '/watch.4c4d39803b119ef010a3.js', '/common.acad5df36574c2182d15.js', 
'/reward4823ace7ccd.js', '/polyfills.2b2696c6c54a9388e1d4.js', '/index.a5be217e620cedc065e5.js']

即使两次数据正则表达式应该读取的类型都是字符串。我已经尝试不转换任何东西或故意将所有内容转换为字符串,但输出始终相同。

这是为什么?

另外,如果有帮助,这里是我正在抓取的(测试)链接(确保 html 更复杂,尽管这不应该改变正则表达式在这种情况下的行为:“https://lolesports.com/schedule?leagues=european -大师,LCS,LCK”

标签: pythonregexbeautifulsouppython-requests

解决方案


正则表达式"(\".+\"|\'.+\')"继续匹配 2"'. 这包括例如 - "/modules.cb8e9af2c2709a34b49b.js""></script><script src="以下子字符串:

<script src="/modules.cb8e9af2c2709a34b49b.js"></script><script src="...

您应该对正则表达式使用re.finditer或添加限制,而不是.+


推荐阅读