循环时使用正则表达式在href中间查找内容

时间:2018-09-11 19:50:46

标签: python beautifulsoup

对于我正在学习的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与正则表达式一起使用时为什么会得到嵌套列表的任何想法?

请让我知道如何改进此问题,以便更清楚地了解我的工作和所要寻找的东西(我知道你们会,甚至没有我问)。

1 个答案:

答案 0 :(得分:1)

您已在页面上打印了每个链接。但是循环中的每次标记仅包含其中一个(您可以打印len(tags)来轻松地进行验证)。

另外,我建议将[a-zA-Z0-9]+替换为\w+-它会捕获字母,数字和下划线,并且更干净。