Regex通过改变Midd从HTML获取值

2024-10-02 10:29:06 发布

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

我试图在twitter链接的末尾正则表达式,其中唯一的标识符是类值fl。因此,正则表达式(据我所知)必须包括:

class=\"fl\"

考虑更改中间部分,其中\S+不起作用,然后查找并分组:

 data-href="http://www.twitter.com/(newyorklife)

在括号中可以找到组。我试图解析的整个字符串是。你知道吗

<g-link class="fl"><a href="/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=32&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjknIy87oHWAhXHi1QKHXQdAJsQ9zAIyQEwHw&amp;url=http%3A%2F%2Fwww.twitter.com%2Fnewyorklife&amp;usg=AFQjCNHKcAcw6H6cYG3YH1j4V3UOxX1whw" onmousedown="return rwt(this,'','','','32','AFQjCNHKcAcw6H6cYG3YH1j4V3UOxX1whw','','0ahUKEwjknIy87oHWAhXHi1QKHXQdAJsQ9zAIyQEwHw','','',event)" data-href="http://www.twitter.com/newyorklife"><div jsl="$t t-XNwoAoU5dyo;$x 0;" class="r-iBA3fWkVHWLE"><g-img class="_tek"><img id="uid_4" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAABZUlEQVR4AWLQWfWQpmjUAjxo1IJRC2wBpJTDQkVRFIafKBujZrnGjbNd84wHiJNs27btrm3rrFbW1T73m20u/yMsW0cBg6zue5XCYLFQcC41JK0I3PsYaWvC+BkugYFljrbmWPp/H/86FOnhB2hGZbTg/dBhFoEBhsoEAO23Su9+5s/9nA0R/ANtXEgNJTtiAgObfB28gZaKt8Wen2ZarhRgjVL8nagGmetC+IFMb5lgqOtOZAtsLVgjcIhFZqD+RLYj0IFzGCwUcRctc7XgNNcyA7GBhAW+EWvnHK3XCjqDhg3OUpvAEegFTgAdA+nrwnuF4zCw7DSlwqOPscRxUAmtiYqY5NDXImz/6mPprlAP1sDgcjdFLokdCkPGW6Kstmbhtoim2IWNsRsvFXNsjURvBmvgiMROc11S0+BhVvmhFAUDhewrISgbg4/qlyUdeEnl+sBk7SOgfcBSb3jWaKMWjFoAABKespvtvzYlAAAAAElFTkSuQmCC" data-deferred="1" class="_WCg" height="32" width="32" alt="" onload="typeof google==='object'&amp;&amp;google.aft&amp;&amp;google.aft(this)"></g-img></div>Twitter</a></g-link>

我不知道正则表达式是否有一个方法,或者是否可以跳过整个中间部分,其中包含这么多特殊字符。我一直在玩pythex.org网站一段时间,找不到一个简单地找到初始值然后跳过所有内容的方法,直到。。。指定值。有什么想法吗?你知道吗

编辑。我想要字符串'Newyorklife'作为输出。虽然这是一个不断变化的值,但实际上我只想要后面的\w+推特网站/. 问题是class=fl是网页上行的唯一唯一标识符(twitter和data href在页面的其他地方显示)。你知道吗


Tags: 字符串comhttpimgdatawwwgooglelink
3条回答

regex needed,请改用合适的解析器:

from bs4 import BeautifulSoup

html = """<g-link class="fl"><a href="/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=32&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjknIy87oHWAhXHi1QKHXQdAJsQ9zAIyQEwHw&amp;url=http%3A%2F%2Fwww.twitter.com%2Fnewyorklife&amp;usg=AFQjCNHKcAcw6H6cYG3YH1j4V3UOxX1whw" onmousedown="return rwt(this,'','','','32','AFQjCNHKcAcw6H6cYG3YH1j4V3UOxX1whw','','0ahUKEwjknIy87oHWAhXHi1QKHXQdAJsQ9zAIyQEwHw','','',event)" data-href="http://www.twitter.com/newyorklife"><div jsl="$t t-XNwoAoU5dyo;$x 0;" class="r-iBA3fWkVHWLE"><g-img class="_tek"><img id="uid_4" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAABZUlEQVR4AWLQWfWQpmjUAjxo1IJRC2wBpJTDQkVRFIafKBujZrnGjbNd84wHiJNs27btrm3rrFbW1T73m20u/yMsW0cBg6zue5XCYLFQcC41JK0I3PsYaWvC+BkugYFljrbmWPp/H/86FOnhB2hGZbTg/dBhFoEBhsoEAO23Su9+5s/9nA0R/ANtXEgNJTtiAgObfB28gZaKt8Wen2ZarhRgjVL8nagGmetC+IFMb5lgqOtOZAtsLVgjcIhFZqD+RLYj0IFzGCwUcRctc7XgNNcyA7GBhAW+EWvnHK3XCjqDhg3OUpvAEegFTgAdA+nrwnuF4zCw7DSlwqOPscRxUAmtiYqY5NDXImz/6mPprlAP1sDgcjdFLokdCkPGW6Kstmbhtoim2IWNsRsvFXNsjURvBmvgiMROc11S0+BhVvmhFAUDhewrISgbg4/qlyUdeEnl+sBk7SOgfcBSb3jWaKMWjFoAABKespvtvzYlAAAAAElFTkSuQmCC" data-deferred="1" class="_WCg" height="32" width="32" alt="" onload="typeof google==='object'&amp;&amp;google.aft&amp;&amp;google.aft(this)"></g-img></div>Twitter</a></g-link>"""

soup = BeautifulSoup(html, 'html5lib')

# select one
user = soup.select_one('.fl > a')["data-href"].split('/')[-1]
print(user)
# newyorklife

要选择多个链接,请使用soup.findAll(),请参见documentation for more information。你知道吗

有一种方法可以在一个regex字符串中完成,但是它会非常难看并且很难阅读。所以我会分两步来解决这个问题。首先捕获类为“fl”的HTML标签,然后在属性中找到Twitter句柄。你知道吗

str = document.documentElement.innerHTML; anchorTag = str.match( "class=\"fl\">([^>]+)" )[1]; matches = anchorTag.match("twitter\.com%2F([^&]+)&"); if( matches != null && matches.length > 1 ){ var handle = matches[1]; } console.log(handle); ; ^{pr2}$ ;

这是一个有效的regexp:

>>> r = re.compile(r'\bclass="fl".*?\bdata-href="http://www\.twitter\.com/(\w+)"', re.S)
>>> r.search(s).group(1)
'newyorklife'

这里的关键概念是非贪婪匹配。因为页面上可能有多个data-href,所以您必须注意在匹配class="fl"之后找到它的第一个出现。因此这里使用.*?表达式来匹配尽可能少的字符,然后再尝试匹配下一个data-href。你知道吗

相关问题 更多 >

    热门问题