urllib.open()无法处理带有#的字符串?

时间:2013-10-16 02:08:33

标签: python string web-scraping beautifulsoup urllib

我正在研究一个小项目,一个网站刮刀,我遇到了(我认为)urllib.open()的问题。所以,假设我想要抓取谷歌的主页,连接查询,然后搜索查询。 (我实际上并没有试图从谷歌中删除,但我认为他们很容易在上面演示。)

from bs4 import BeautifulSoup
import urllib

url = urllib.urlopen("https://www.google.com/")

soup = BeautifulSoup(url)

parseList1=[]

for i in soup.stripped_strings:
    parseList1.append(i)

parseList1 = list(parseList1[10:15])

#Second URL

url2 = urllib.urlopen("https://www.google.com/"+"#q=Kerbal Space Program")

soup2 = BeautifulSoup(url2)

parseList2=[]

for i in soup2.stripped_strings:
    parseList2.append(i)

parseList2 = list(parseList2[10:15])

#Third URL

url3 = urllib.urlopen("https://www.google.com/#q=Kerbal Space Program")

soup3 = BeautifulSoup(url3)

parseList3=[]

for i in soup3.stripped_strings:
    parseList3.append(i)

parseList3 = list(parseList3[10:15])

print " 1 "

for i in parseList1:
    print i

print " 2 "

for i in parseList2:
    print i

print " 3 "

for i in parseList3:
    print i

打印出来:

1

A whole nasty mess of scraped code from Google

2

3

这让我相信#符号可能会阻止网址被打开? 连接字符串不会为连接引发任何错误,但仍然不会读取任何内容。

有没有人知道为什么会这样?我从没想过字符串中的#会对代码产生任何影响。我认为这对我来说是一些愚蠢的错误,但如果是的话,我看不到它。

由于

1 个答案:

答案 0 :(得分:3)

浏览器不应将url片段部分(以“#”结尾)发送到服务器。

  

RFC 1808 (Relative Uniform Resource Locators):注意片段标识符(以及它之前的“#”)是   不被视为URL的一部分。但是,因为它是常用的   在与URL相同的字符串上下文中,解析器必须能够   在片段存在时识别片段并将片段放在一边作为片段的一部分   解析过程。

您可以在浏览器中获得正确的结果,因为浏览器向https://www.google.com发送请求,jl检测到url片段(这与拼写检查类似,大多数网站都不会这样做),浏览器然后发送一个新的ajax请求(https://www.google.com?q=xxxxx),最后渲染具有json数据的页面。 urllib无法为您执行javascript。

要解决您的问题,只需将https://www.google.com/#q=Kerbal Space Program替换为https://www.google.com/?q=Kerbal Space Program

即可