【问题标题】:Opening page using urllib2 - diacritics使用 urllib2 打开页面 - 变音符号
【发布时间】:2014-11-02 23:53:35
【问题描述】:

我正在尝试使用 urllib2 打开多个页面。问题是某些页面无法打开。它返回urllib2.HTTPerror: HTTP Error 400: Bad Request

我正在从另一个网页获取此页面的 href(页面头部是 charset = "utf-8")。 仅当我尝试打开 url 中包含“č”、“ž”或“ř”的页面时,才会返回错误。

代码如下:

def getSoup(url):
    req = urllib2.Request(url)

    response = urllib2.urlopen(req)
    page = response.read()
    soup = BeautifulSoup(page, 'html.parser')
    return soup




hovienko = getSoup("http://www.hovno.cz/hovna-az/a/1/")
lis = hovienko.find("div", class_="span12").find('ul').findAll('li')

for liTag in lis:

    aTag = liTag.find('a')['href']
    href = "http://www.hovno.cz"+aTag  """ hrefs, I'm trying to open using urllib2 """
    soup = getSoup(href.encode("iso-8859-2")) """ here occures errors when 'č','ž' or 'ř' in url """

有谁知道,我必须做些什么来避免错误?

谢谢

【问题讨论】:

    标签: python html urllib2


    【解决方案1】:

    解决方案非常简单。我应该使用 urllib2.quote()。

    编辑代码:

    for liTag in lis:
    
        aTag = liTag.find('a')['href']
        href = "http://www.hovno.cz"+urllib2.quote(aTag.encode("utf-8"))
        soup = getSoup(href)
    

    【讨论】:

      【解决方案2】:

      这个网站是 UTF-8。为什么需要 href.encode("iso-8859-2") ?我从http://programming-review.com/beautifulsoasome-interesting-python-functions/获取了下一个代码

          import urllib2
          import cgitb
          cgitb.enable()
          from BeautifulSoup import BeautifulSoup
          from urlparse import urlparse
      
      # print all links
      def PrintLinks(localurl):
          data = urllib2.urlopen(localurl).read()
          print 'Encoding of fetched HTML : %s', type(data)
          soup = BeautifulSoup(data)
          parse = urlparse(localurl)
          localurl = parse[0] + "://" + parse[1]
          print "<h3>Page links statistics</h3>"
          l = soup.findAll("a", attrs={"href":True})
          print "<h4>Total links count = " + str(len(l)) + '</h4>'
          externallinks = [] # external links list
          for link in l:
          # if it's external link
              if link['href'].find("http://") == 0 and link['href'].find(localurl) == -1:
                  externallinks = externallinks + [link]
          print "<h4>External links count = " + str(len(externallinks)) + '</h4>'
      
      
          if len(externallinks) > 0:
              print "<h3>External links list:</h3>"
              for link in externallinks:
                if link.text != '':
                  print '<h5>' + link.text.encode('utf-8')
                  print ' => [' + '<a href="' + link['href'] + '" >' + link['href'] + '</a>' +  ']' + '</h5>'
                else:
                  print '<h5>' + '[image]',
                  print ' => [' + '<a href="' + link['href'] + '" >' + link['href'] + '</a>' +  ']' + '</h5>'
      
      
      PrintLinks( "http://www.zlatestranky.cz/pro-mobily/")
      

      【讨论】:

        【解决方案3】:

        这里有几件事。

        首先,您的 URI 不能包含非 ASCII。你必须更换它们。看到这个: How to fetch a non-ascii url with Python urlopen?

        其次,为自己省去一个痛苦的世界,并将requests 用于 HTTP 内容。

        【讨论】:

        • 谢谢 Bobby,我已经使用 urllib2.quote() 解决了这个问题。您能告诉我使用请求如何帮助我编写代码吗?例如下面的这段代码。谢谢
        • 请求库有一个更好的 API。请参阅 this example 以了解我在说什么。
        猜你喜欢
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2016-01-21
        相关资源
        最近更新 更多