对于我在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和正则表达式时,为什么我得到嵌套列表的任何想法?
请让我知道如何改进这个问题,以便更清楚我做了什么以及我在寻找什么(我知道你们会,没有我甚至会问)。
您已打印页面上的每个链接。但每次循环标记只包含其中一个(您可以打印len(tags)
以轻松验证它)。
此外,我建议用[a-zA-Z0-9]+
替换\w+
- 它会捕捉字母,数字和下划线,并且更清洁。