如何从完整的 html 文本中从 <a> 标记中提取 url GET 参数

Posted

技术标签:

【中文标题】如何从完整的 html 文本中从 <a> 标记中提取 url GET 参数【英文标题】:How to extract url GET parameter from <a> tag, from the full html text 【发布时间】:2011-03-30 21:02:52 【问题描述】:

所以我有一个 html 页面。它充满了各种标签,其中大多数在其 href 属性中都有 sessionid GET 参数。示例:

...
<a href="struct_view_distrib.asp?sessionid=11692390">
...
<a href="SHOW_PARENT.asp?sessionid=11692390">
...
<a href="nakl_view.asp?sessionid=11692390">
...
<a href="move_sum_to_7300001.asp?sessionid=11692390&mode_id=0">
...

所以,如您所见,sessionid 是相同的,我只需要将其值放入变量中,无论来自哪个变量:x=11692390 我是正则表达式的新手,但谷歌没有帮助。非常感谢!

【问题讨论】:

不要使用 RegEx 解析 HTML。必填链接:***.com/questions/1732348/… 【参考方案1】:

bs4 4.7.1.+ 具有您需要的所有功能。使用 css AND 语法结合 :not 指定带有参数 sessionid 的 url 和 select_one 限制为第一次匹配,然后在该参数上拆分并获取 ubound 数组值

soup.select_one("[href*='asp?sessionid']:not([href*='&'])")['href'].split('sessionid=')[-1]

【讨论】:

【参考方案2】:

受 AbdealiJK 启发的 Python3 完整示例:

response = """...
<a href="struct_view_distrib.asp?sessionid=11692390">
...
<a href="SHOW_PARENT.asp?sessionid=11692390">
...
<a href="nakl_view.asp?sessionid=11692390">
...
<a href="move_sum_to_7300001.asp?sessionid=11692390&mode_id=0">
..."""

from bs4 import BeautifulSoup
import urllib.parse
soup = BeautifulSoup(response, "lxml")
for i in soup.find_all('a', href=True):
    try:
        print(urllib.parse.parse_qs(urllib.parse.urlparse(i['href']).query)["sessionid"])
    except:
        pass

【讨论】:

【参考方案3】:

我会这样做 - 在我被告知这是一个 python 问题之前;)

<script>
function parseQString(loc) 
  var qs = new Array();
  loc = (loc == null) ? location.search.substring(1):loc.split('?')[1];
  if (loc) 
    var parms = loc.split('&');
    for (var i=0;i<parms.length;i++) 
      nameValue = parms[i].split('=');
      qs[nameValue[0]]=(nameValue.length == 2)? unescape(nameValue[1].replace(/\+/g,' ')):null; // use null or ""
    
  
  return qs;

var ids = []; // will hold the IDs
window.onload=function() 
  var links = document.links;
  var id;
  for (var i=0, n=links.length;i<n;i++) 
    ids[i] = parseQString(links[i].href)["sessionid"];
  
  alert(ids); // remove this when happy
  // here you can do 
  alert(ids[3]); 
  //to get the 4th link's sessionid



</script>

<a href="struct_view_distrib.asp?sessionid=11692390">
...</a>
<a href="SHOW_PARENT.asp?sessionid=11692390">
...</a>
<a href="nakl_view.asp?sessionid=11692390">
...</a>
<a href="move_sum_to_7300001.asp?sessionid=11692390&mode_id=0">
...</a>

【讨论】:

Erm okee,那么蟒蛇的头在哪里呢?我回答时没有这样标记 对不起,我在这里的第一个问题,我认为问题只是关于正则表达式并且忘记为 python 标记它 有趣。那么,浏览器js中解析uri就没有标准方法了吗? @Constantin:你什么意思? location.protocol、location.hostName、location.port、location.href、location.search、location.hash 是你可以使用的,但 location.search 和 .hash 是字符串,不会进一步原子化【参考方案4】:

这不使用正则表达式,但无论如何,这就是你在 Python 2.6 中要做的:

from BeautifulSoup import BeautifulSoup
import urlparse

soup = BeautifulSoup(html)
links = soup.findAll('a', href=True)

for link in links:
  href = link['href']
  url = urlparse.urlparse(href)
  params = urlparse.parse_qs(url.query)
  if 'sessionid' in params:
    print params['sessionid'][0]

【讨论】:

非常感谢,正是我需要的! +l for urlparse,这个库太棒了,如果没有它,尝试解决这样的问题真是太可惜了 import urllib.parseurllib.parse.parse_qs(urllib.parse.urlparse(href).query) 在 python3 中【参考方案5】:

下面是一个正则表达式,可用于匹配 href 并提取其值:

\b(?<=(href="))[^"]*?(?=")

【讨论】:

我不鼓励使用正则表达式来获取属性。不会投反对票,但我也不想投赞成票。 除非 DOM 不可访问,否则我完全同意。你有 document.links[x].href 和 document.getElementsByTagName("a")[x].href 不使用 jQuery 或 regExp 是的,我完全同意正则表达式解析 html 是个坏主意。如果您看到我以前的正则表达式答案,我一直在告诉每个人。现在,既然有人已经在我面前的另一个答案中说了这个,而且我厌倦了一遍又一遍地说同样的话,我就把正则表达式放在这里。【参考方案6】:

使用 DOM 解析库解析 HTML 并使用 getElementsByTagName('a') 抓取锚点,遍历它们并使用 getAttribute('href') 然后提取字符串。然后您可以使用正则表达式或拆分 ? 来匹配/检索会话 ID。

【讨论】:

以上是关于如何从完整的 html 文本中从 <a> 标记中提取 url GET 参数的主要内容,如果未能解决你的问题,请参考以下文章

在HTML中如何在div中从一个链接到另一div

如何在 .NET 中从文本中去除 HTML?

在 PHP 中从文本到图像

如何在angularjs中从模板html调用指令

在Linux中从文本文件中删除字符

在 node.js 中从字符串创建一个文本文件并将其作为响应流式传输