gpt4 book ai didi

python - 在Python中使用re.findall()进行网络爬虫

转载 作者:行者123 更新时间:2023-11-30 23:25:00 25 4
gpt4 key购买 nike

我正在尝试通过编写一个非常简单的网络爬虫来自学 Python。

它的代码在这里:

#!/usr/bin/python

import sys, getopt, time, urllib, re

LINK_INDEX = 1
links = [sys.argv[len(sys.argv) - 1]]
visited = []
politeness = 10
maxpages = 20

def print_usage():
print "USAGE:\n./crawl [-politeness <seconds>] [-maxpages <pages>] seed_url"

def parse_args():
#code for parsing arguments (works fine so didnt need to be included here)

def crawl():
global links, visited
url = links.pop()
visited.append(url)

print "\ncurrent url: %s" % url

response = urllib.urlopen(url)
html = response.read()

html = html.lower()

raw_links = re.findall(r'<a href="[\w\.-]+"', html)

print "found: %d" % len(raw_links)

for raw_link in raw_links:
temp = raw_link.split('"')
if temp[LINK_INDEX] not in visited and temp[LINK_INDEX] not in links:
links.append(temp[LINK_INDEX])

print "\nunvisited:"
for link in links:
print link

print "\nvisited:"
for link in visited:
print link

parse_args()

while len(visited) < maxpages and len(links) > 0:
crawl()
time.sleep(politeness)

print "politeness = %d, maxpages = %d" % (politeness, maxpages)

我在同一工作目录中创建了一个小型测试网络,大约有 10 个页面,它们以各种方式链接在一起,看起来工作正常,但是当我将其发送到实际的互联网上时,它无法解析它获取的文件中的链接。

它能够很好地获取 html 代码,因为我可以将其打印出来,但似乎 re.findall()部分没有做它应该做的事情,因为链接列表永远不会被填充。我的正则表达式可能写错了吗?找到像 <a href="test02.html" 这样的字符串效果很好。然后解析其中的链接,但由于某种原因,它不适用于实际的网页。可能是 http 部分导致了它的失败?

我以前从未在 Python 中使用过正则表达式,所以我很确定这就是问题所在。谁能告诉我如何更好地表达我正在寻找的模式?谢谢!

最佳答案

问题出在您的正则表达式上。我可以通过很多方法来编写您的正则表达式无法匹配的有效 HTML anchor 。例如,其中可能存在额外的空格或换行符,并且可能存在您尚未考虑到的其他属性。另外,您没有考虑不同的情况。例如:

<a  href="foo">foo</a>

<A HREF="foo">foo</a>

<a class="bar" href="foo">foo</a>

这些都不会与您的正则表达式匹配。

您可能想要更像这样的东西:

<a[^>]*href="(.*?)"

这将匹配 anchor 标记开始,后跟除 > 之外的任何字符(以便我们仍然在标记内匹配)。这可能是诸如 classid 属性之类的东西。然后,href 属性的值将被捕获到捕获组中,您可以通过以下方式提取该值:

match.group(1)

href 值的匹配也是非贪婪的。这意味着它将匹配可能的最小匹配。这是因为,否则如果同一行上有其他标签,您将匹配超出您想要的内容。

最后,您需要添加 re.I 标志以不区分大小写的方式进行匹配。

关于python - 在Python中使用re.findall()进行网络爬虫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23156059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com