如何从完整的HTML文本中提取<a>标签的URL GET参数

6

我有一个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 我对正则表达式还不熟悉,但谷歌并没有帮助。非常感谢!


6
不要使用正则表达式解析HTML。强制链接:https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Oded
6个回答

11

这个解决方案并没有使用正则表达式。但是,无论如何,在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]

对于 urlparse,这个库非常棒,如果不使用它来解决这样的问题,那真是太可惜了。 - jwg
3
在Python3中,import urllib.parse 是导入urllib.parse模块的语句。urllib.parse.parse_qs(urllib.parse.urlparse(href).query) 则是对传入的href字符串进行解析,并返回其查询参数部分的字典形式。 - AbdealiJK

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

2

在我被告知这是一个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>

好的,那么Python从哪里冒出来的?当我回答时没有被标记为这样。 - mplungjan
抱歉,这是我在这里的第一个问题,我以为问题只涉及正则表达式,忘记为Python打标签了。 - creitve
有趣。那么,在浏览器JS中解析URI的标准方法是不存在的吗? - Constantin
@Constantin:你的意思是什么?你可以使用location.protocol、location.hostName、location.port、location.href、location.search和location.hash,但location.search和.hash是字符串,不进一步分解。 - mplungjan

1
以下是一个正则表达式,您可以使用它来匹配 href 并提取其值:
\b(?<=(href="))[^"]*?(?=")

3
我不会鼓励使用正则表达式来获取属性。我不会投反对票,但也不想点赞。 - Rob
除非DOM不可访问,否则我完全同意。 你可以直接使用document.links[x].href和document.getElementsByTagName("a")[x].href,而无需使用jQuery或regExp。 - mplungjan
是的,我完全同意使用正则表达式解析HTML是个坏主意。如果你看过我的以前的正则表达式答案,我一直在告诉每个人这一点。现在既然有人在我之前的另一个答案中已经说了这个问题,而且我也厌倦了一遍又一遍地说同样的话,所以我只是把正则表达式放在这里了。 - Gopi

1

这是一个Python3的完整示例,灵感来自于AbdealiJK:

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

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接