首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用regex在循环过程中查找href中的内容。

使用regex在循环过程中查找href中的内容。
EN

Stack Overflow用户
提问于 2018-09-11 19:50:46
回答 1查看 84关注 0票数 0

为了获得Python初学者的“额外学分”,我想使用regex从URL中提取数据。我知道我还有其他方法可以做这件事,但是我的食客迫切需要工作所以.

给定一个要开始的URL,在页面上查找href的xth事件,并使用该链接降低一个级别。冲洗和重复,直到我已经在网页上找到所需的链接,在网站上要求的深度。

我正在使用Python3.7和Beautiful 4。在程序开始时,在做完所有家务活之后,我有:

代码语言:javascript
代码运行次数:0
运行
复制
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:

代码语言:javascript
代码运行次数:0
运行
复制
html = urllib.request.urlopen(url, context=ctx).read()
soup = BeautifulSoup(html, 'html.parser')
tags = soup('a')

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

代码语言:javascript
代码运行次数:0
运行
复制
# 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。所以更多的研究和我已经发现:

代码语言:javascript
代码运行次数:0
运行
复制
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表达式’,desired_link)。

我想是时候求助了。

而且,在我们讨论这个问题的时候,对于为什么我第一次在正则表达式中使用re.findall时会得到嵌套列表,有什么想法吗?

请让我知道如何改进这个问题,这样我就可以更清楚地知道我做了什么和我在寻找什么(我知道你们会的,甚至没有我的要求)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-11 21:02:51

你把页面上的每一个链接都打印出来了。但是每次循环标记中只包含其中一个(您可以打印len(tags)以方便地验证它)。

另外,我建议用[a-zA-Z0-9]+代替\w+ --它会捕捉字母、数字和下划线,而且更干净。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52283259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档