为了获得Python初学者的“额外学分”,我想使用regex从URL中提取数据。我知道我还有其他方法可以做这件事,但是我的食客迫切需要工作所以.
给定一个要开始的URL,在页面上查找href的xth事件,并使用该链接降低一个级别。冲洗和重复,直到我已经在网页上找到所需的链接,在网站上要求的深度。
我正在使用Python3.7和Beautiful 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表达式’,desired_link)。
我想是时候求助了。
而且,在我们讨论这个问题的时候,对于为什么我第一次在正则表达式中使用re.findall时会得到嵌套列表,有什么想法吗?
请让我知道如何改进这个问题,这样我就可以更清楚地知道我做了什么和我在寻找什么(我知道你们会的,甚至没有我的要求)。
发布于 2018-09-11 13:02:51
你把页面上的每一个链接都打印出来了。但是每次循环标记中只包含其中一个(您可以打印len(tags)
以方便地验证它)。
另外,我建议用[a-zA-Z0-9]+
代替\w+
--它会捕捉字母、数字和下划线,而且更干净。
https://stackoverflow.com/questions/52283259
复制相似问题