我正在开发一个简单的程序,它从给定的网站中提取链接并将它们放在一个列表中。然后,以相同的方式逐步分析" todo" -list中提取的URL。
主程序正在运行,但在下一个版本中,我只想提取主页并忽略底层(例如" www.stackoverflow.com"但不是" www.stackoverflow.com /问题/问&#34)
我尝试使用re.findall
函数但因为它是list
对象,它会破坏我的可迭代todo-list的结构。
是否有可能在使用正则表达式时返回一个字符串?
soup = BeautifulSoup(handle, 'html.parser')
newlinks = soup.find_all('a')
for link in newlinks:
todo.append( re.findall('(http://.+)/', link.get('href')) )
答案 0 :(得分:0)
如果您只想为每个输入字符串添加一个匹配项,请不要使用findall
,其目的是找到许多匹配项。
而是使用re.match(pattern, text)
来获取match
个对象。检查返回值是否为None
(表示未找到匹配项),然后在其上调用group(1)
以获取匹配的组。
请注意,您的模式实际上并不是您想要的。如果只想匹配URL的初始部分(包括域,而不是路径),则需要从模式的重复部分中排除斜杠。我使用'(http://[^/]+)/'
。使用+?
代替+
的非贪婪重复是另一种选择。
如果您考虑放弃整个RegEx方法来处理您的网址,您可能需要尝试使用urllib
模块。致电urllib.parse.urlsplit
会将网址拆分为以下部分:<scheme>://<netloc>/<path>?<query>#<fragment>
。 (这可能是Python 3中的一个新功能,虽然我不确定。urllib
模块在版本之间重新安排了很多。)