我正在尝试使用urllib2抓取一个网站。但是我得到了400页未找到错误。这是我的代码:
rec_text = 'Genesis 1:1'
my_text = rec_text.strip()
book = my_text.split()[0]
chapter_verse = my_text.split()[1]
chapter = chapter_verse.split(':')[0]
verse = chapter_verse.split(':')[1]
webpage = urllib2.urlopen('http://bible.cc/'+book+'/'+chapter+'-'+verse+'.htm').read()
stuffToSearch = ""
for line in webpage:
stuffToSearch += line
search_for = re.compile(r'<a href="http://kingjbible.com/'+book+'/'+chapter+'.htm">King James Bible</a></span><br>(.*)<p><span class="versiontext"><a href="http://kjv.us/'+book+'/'+chapter+'.htm">')
search_it = re.search(search_for, stuffToSearch)
print(search_it.group(1))
答案 0 :(得分:1)
查看bible.cc
网站,似乎资本化非常重要。您需要genesis
而不是Genesis
,您可以将该行更改为book = my_text.split()[0].lower()
。
编辑:其余部分实际上与错误无关,但还有一些其他提示。
您可以使用多个赋值来简化代码,其中您可以从一个操作输出两个或更多值。
rec_text = 'Genesis 1:1'
my_text = rec_text.strip().lower()
book, chapter_verse = my_text.split()
chapter, verse = chapter_verse.split(':')
还有一种方法可以将字符串列表连接在一起而无需使用for循环。使用join
,其中调用它的字符串将用作列表元素之间的分隔符(基本上与split
相反)。
stuffToSearch = "".join(webpage)
我想页面检索没有任何问题,但我认为readlines
会比read
略微提高效率。与正则表达式相同;如果你只使用它一次,你不需要编译它。你可能很容易想出一个独立于可以重复使用的书和章节的表达式。
答案 1 :(得分:0)
这个过程是正确的,只是形成的网址可能不正确。
为什么不将'http://bible.cc/'+book+'/'+chapter+'-'+verse+'.htm'
分配给某个变量&amp;在将其发送到urlopen
之前将其打印出来?
这样您就可以验证网址是否正确。