在爬网Javascrip中获取相对URL的正则表达式

2024-04-19 04:48:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个与Scrapy爬虫设置,并试图处理链接。问题是链接是嵌入在Javascript中的,我正在努力创建一个正则表达式。以下是我尝试处理的3个示例:

  1. javascript:openInIFrame('main', 'setup.phtml%3f.op%3d3800%26.who%3dAAAAAAAAAAAA%26.menuItemRefNo=118')
  2. javascript:window.open('overview.phtml?&.who=AAAAAAAAAAAA&.id=2', '43425235', 'menubar=no,toolbar=no,location=no,resizable=yes,maximize=yes');
  3. javascript:openInIFrame('main', "page.phtml%3f.op%3d1499%26.who%3dAAAAAAAAAAAA%26.ifmod%3dtest&.menuItemRefNo=7")

每个的结果相对URL将位于单引号/双引号之间:

  1. setup.phtml%3f.op%3d3800%26.who%3dAAAAAAAAAAAA%26.menuItemRefNo=118
  2. overview.phtml?&.who=AAAAAAAAAAAA&.id=2
  3. page.phtml%3f.op%3d1499%26.who%3dAAAAAAAAAAAA%26.ifmod%3dtest&.menuItemRefNo=7

我尝试过'(.*?)'(["'])(?:(?=(\\?))\2.)*?\1的变体,但似乎无法正确实现。我错过了什么?你知道吗


Tags: noid链接mainsetuppageoverviewjavascript
2条回答

或许可以试试这样的方法:

['"].*phtml.*['"]

http://regex101.com/r/lX6xX8/1

试试这个

import re

url_regex = re.compile(r"(?:javascript:openInIFrame\('main',|javascript:window.open\()\s*(?:'|\")([^'\"]+)(?:'|\")")

samples = [
  "javascript:openInIFrame('main', 'setup.phtml%3f.op%3d3800%26.who%3dAAAAAAAAAAAA%26.menuItemRefNo=118')",
  "javascript:window.open('overview.phtml?&.who=AAAAAAAAAAAA&.id=2', '43425235', 'menubar=no,toolbar=no,location=no,resizable=yes,maximize=yes');",
  "javascript:openInIFrame('main', \"page.phtml%3f.op%3d1499%26.who%3dAAAAAAAAAAAA%26.ifmod%3dtest&.menuItemRefNo=7\")"
]

for sample in samples:
  md = url_regex.search(sample)
  if md:
    print md.group(1)
  else:
    print 'NO MATCH'

对我来说,这输出:

setup.phtml%3f.op%3d3800%26.who%3dAAAAAAAAAAAA%26.menuItemRefNo=118
overview.phtml?&.who=AAAAAAAAAAAA&.id=2
page.phtml%3f.op%3d1499%26.who%3dAAAAAAAAAAAA%26.ifmod%3dtest&.menuItemRefNo=7

诀窍是([^'\"]+)。只要字符不是双引号或单引号,就可以捕获一个或多个字符的任何序列。所以基本上,所有的东西都在URL字符串的末尾,也就是URL。注意,\"是必需的,因为正则表达式本身是用"分隔的

相关问题 更多 >