对于我正在学习的Python初学者课程中的“额外功劳”,我想使用正则表达式从URL中提取数据。我知道还有其他方法可以做到这一点,但是我的regex迫切需要工作,所以...
给出一个URL开头,找到页面上href的第x次出现,然后使用该链接下一级。漂洗并重复直到在页面上按所需深度找到所需的链接。
我正在使用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']]
嗯,有点奇怪,没想到嵌套列表,但是我知道如何拼合列表,所以没关系。继续吧。
我通过几个循环工作,使用以下命令打开每个网址以进入下一个级别:
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',required_link)中使用的变量的方法。
我认为是时候寻求帮助了。
而且,在讨论的过程中,关于为什么我第一次将re.findall与正则表达式一起使用时为什么会得到嵌套列表的任何想法?
请让我知道如何改进此问题,以便更清楚地了解我的工作和所要寻找的东西(我知道你们会,甚至没有我问)。
答案 0 :(得分:1)
您已在页面上打印了每个链接。但是循环中的每次标记仅包含其中一个(您可以打印len(tags)
来轻松地进行验证)。
另外,我建议将[a-zA-Z0-9]+
替换为\w+
-它会捕获字母,数字和下划线,并且更干净。