在循环时使用正则表达式在href中间找到一些东西

问题描述 投票:0回答:1

对于我在Python中的初学者课程中的“额外学分”,我想使用正则表达式从URL中提取数据。我知道还有其他方法可以做到这一点,但我的正则表达式迫切需要工作......

给定一个开始的URL,在页面上找到第h个href,并使用该链接进入某个级别。冲洗并重复,直到我在网站上请求的深度找到所需的链接。

我正在使用Python 3.7和Beautiful Soup 4.在程序开始时,在完成所有的内务管理之后,我有:

starting_url = 'http://blah_blah_blah_by_Joe.html'
extracted_name = re.findall('(?<=by_)([a-zA-Z0-9]+)[^.html]*', starting_url)
selected_names.append(extracted_name)
# Just for testing purposes
print(selected_name)  [['Joe']]

嗯,有点奇怪没想到嵌套列表,但我知道如何压扁列表,好吧。我们继续。

我通过几个循环工作,通过使用以下方式打开下一级别的每个URL:

html = urllib.request.urlopen(url, context=ctx).read()
soup = BeautifulSoup(html, 'html.parser')
tags = soup('a')

继续处理,并在程序应该找到我想要的href的循环中:

# Testing to check I have found the correct href
print(desired_link)  <a href="http://blah_blah_blah_by_Mary.html">blah 
    blah</a>
type(desired_link) bs4.element.tag

正确的链接,但对我来说是一个“类型”,而不是我可以使用re.findall的东西。所以更多的研究和我发现:

for link in soup.find_all('a') :
    tags = link.get('href')
    type(tags) str
    print(tags)
       http://blah_blah_blah_by_George.html 
       http://blah_blah_blah_by_Bill.html 
       http://blah_blah_blah_by_Mary.html
       etc.

正确的类型,但是当我看到打印的内容时,我认为我所看到的可能只是一根长串?我需要一种方法来将字符串中的第三个href分配给我可以在re.findall中使用的变量('regex expression',desired_link)。

我想是时候寻求帮助了。

而且,虽然我们在这里,但是我第一次使用re.findall和正则表达式时,为什么我得到嵌套列表的任何想法?

请让我知道如何改进这个问题,以便更清楚我做了什么以及我在寻找什么(我知道你们会,没有我甚至会问)。

python beautifulsoup
1个回答
1
投票

您已打印页面上的每个链接。但每次循环标记只包含其中一个(您可以打印len(tags)以轻松验证它)。

此外,我建议用[a-zA-Z0-9]+替换\w+ - 它会捕捉字母,数字和下划线,并且更清洁。

© www.soinside.com 2019 - 2024. All rights reserved.