如何从完整的 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 forurlparse
,这个库太棒了,如果没有它,尝试解决这样的问题真是太可惜了
import urllib.parse
和 urllib.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 参数的主要内容,如果未能解决你的问题,请参考以下文章