【发布时间】:2014-04-18 14:21:19
【问题描述】:
我正在尝试通过编写一个非常简单的网络爬虫来自学 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。使用实际的 HTML 解析器。我建议
BeautifulSoup。 -
你的正则表达式是正确的,你确定
html没有Unicode字符吗? -
html 中的一个链接是
http://www.theage.com.au/digital-life/mobiles/Mobiles(我只是在age 网站上运行它进行测试),它应该得到那个链接吗?我不认为那里有任何 unicode 字符.. -
实际上,在阅读了更多内容之后,正则表达式中的“w”运算符似乎只代表“单词”字符,即。 a-z、A-Z、0-9 和 _。所以它可能是“:”和“//”导致它出错..知道用什么代替吗?
标签: python regex web-crawler findall