鱼C论坛

 找回密码
 立即注册
查看: 1205|回复: 6

[已解决]python 55讲的课后作业

[复制链接]
发表于 2020-3-28 19:11:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请教各位大神,发现小甲鱼几年前写的代码爬取百度百科时会出错。我应该怎么改呢?
  1. import urllib.request
  2. import urllib.parse
  3. import re
  4. from bs4 import BeautifulSoup

  5. def test_url(soup):
  6.     result = soup.find(text=re.compile("百度百科尚未收录词条"))
  7.     if result:
  8.         print(result[0:-1]) # 百度这个碧池在最后加了个“符号,给它去掉
  9.         return False
  10.     else:
  11.         return True

  12. def summary(soup):
  13.     word = soup.h1.text
  14.     # 如果存在副标题,一起打印
  15.     if soup.h2:
  16.         word += soup.h2.text
  17.     # 打印标题
  18.     print(word)
  19.     # 打印简介
  20.     if soup.find(class_="lemma-summary"):
  21.         print(soup.find(class_="lemma-summary").text)   

  22. def get_urls(soup):
  23.     for each in soup.find_all(href=re.compile("view")):
  24.         content = ''.join([each.text])

  25.         url2 = ''.join(["http://baike.baidu.com", each["href"]])
  26.         
  27.         response2 = urllib.request.urlopen(url2)
  28.         html2 = response2.read()
  29.         soup2 = BeautifulSoup(html2, "html.parser")
  30.         if soup2.h2:
  31.             content = ''.join([content, soup2.h2.text])
  32.         content = ''.join([content, " -> ", url2])
  33.         yield content
  34.         

  35. def main():
  36.     word = input("请输入关键词:")
  37.     keyword = urllib.parse.urlencode({"word":word})
  38.     response = urllib.request.urlopen("https://baike.baidu.com/search/word?%s" % keyword)
  39.     html = response.read()
  40.     soup = BeautifulSoup(html, "html.parser")

  41.     if test_url(soup):
  42.         summary(soup)
  43.         
  44.         print("下边打印相关链接:")
  45.         each = get_urls(soup)
  46.         while True:
  47.             try:
  48.                 for i in range(10):
  49.                     print(next(each))
  50.             except StopIteration:
  51.                 break
  52.             
  53.             command = input("输入任意字符将继续打印,q退出程序:")
  54.             if command == 'q':
  55.                 break
  56.             else:
  57.                 continue
  58.    
  59. if __name__ == "__main__":
  60.     main()
复制代码
最佳答案
2020-3-29 10:02:14
原来小甲鱼写的时候没有link里边有中文的连接,后边有中文的连接了,所以不行,把他那个keyword在url2哪里输一遍,把汉字编码就好了,改一下就okl了
  1. mport urllib.request
  2. import urllib.parse
  3. import re
  4. from bs4 import BeautifulSoup

  5. def test_url(soup):
  6.     result = soup.find(text=re.compile("百度百科尚未收录词条"))
  7.     if result:
  8.         print(result[0:-1]) # 百度这个碧池在最后加了个“符号,给它去掉
  9.         return False
  10.     else:
  11.         return True

  12. def summary(soup):
  13.     word = soup.h1.text
  14.     # 如果存在副标题,一起打印
  15.     if soup.h2:
  16.         word += soup.h2.text
  17.     # 打印标题
  18.     print(word)
  19.     # 打印简介
  20.     if soup.find(class_="lemma-summary"):
  21.         print(soup.find(class_="lemma-summary").text)   

  22. def get_urls(soup):
  23.     for each in soup.find_all(href=re.compile("view")):
  24.         content = ''.join([each.text])
  25.         print(each.text)
  26.         if '=' in each['href']:
  27.                
  28.             [links,name] = each['href'].split('Name=',2)
  29.             keyname = urllib.parse.urlencode({"Name":name})
  30.             key_link = links + keyname
  31.         else:
  32.             key_link = each['href']
  33.         url2 = ''.join(["http://baike.baidu.com", key_link])
  34.         response2 = urllib.request.urlopen(url2)
  35.         html2 = response2.read()
  36.         soup2 = BeautifulSoup(html2, "html.parser")
  37.         if soup2.h2:
  38.             content = ''.join([content, soup2.h2.text])
  39.         content = ''.join([content, " -> ", url2])
  40.         yield content
  41.         

  42. def main():
  43.     word = input("请输入关键词:")
  44.     keyword = urllib.parse.urlencode({"word":word})
  45.     response = urllib.request.urlopen("https://baike.baidu.com/search/word?%s" % keyword)
  46.     html = response.read()
  47.     soup = BeautifulSoup(html, "html.parser")

  48.     if test_url(soup):
  49.         summary(soup)
  50.         
  51.         print("下边打印相关链接:")
  52.         each = get_urls(soup)
  53.         while True:
  54.             try:
  55.                 for i in range(10):
  56.                     print(next(each))
  57.             except StopIteration:
  58.                 break
  59.             
  60.             command = input("输入任意字符将继续打印,q退出程序:")
  61.             if command == 'q':
  62.                 break
  63.             else:
  64.                 continue
  65.    
  66. if __name__ == "__main__":
  67.     main()

复制代码

这是结果:
请输入关键词:tom
汤姆(美国动画片《猫和老鼠》中的主角)

汤姆(Tom)是米高梅公司制作的经典动画片《猫和老鼠》中的主角之一,70年代老动画中的著名卡通明星角色,是一只蓝灰和白色混合的英国短毛猫。他与小老鼠杰瑞(Jerry)之间可称得上是一对欢喜冤家,二者亦敌亦友,有时互相捣乱,有时互相帮助,有时争论不休,有时团结和谐。他每天忙碌于捉住同住在一起的杰瑞,但总是不如意,总在被耍,憨傻得可爱。生活中充满幽默搞笑,同时也具有抒情与伤情的一幕;主人通常都为两只鞋太太(又黑又胖的女人)。另外,他也爱慕漂亮的千金母猫图多盖洛。有时还被其他成员欺负,如斯派克(Spike)、布奇、莱特宁、托普斯等。

下边打印相关链接:
恐龙百科
恐龙百科 -> http://baike.baidu.com/wikicategory/view?categoryName=%E6%81%90%E9%BE%99%E5%A4%A7%E5%85%A8
多肉百科
多肉百科 -> http://baike.baidu.com/wikicategory/view?categoryName=%E5%A4%9A%E8%82%89%E6%A4%8D%E7%89%A9
里约残奥会吉祥物
里约残奥会吉祥物(里约残奥会吉祥物) -> http://baike.baidu.com/item/TOM/19885318#viewPageContent
名字
名字(名字) -> http://baike.baidu.com/item/TOM/2044473#viewPageContent
全面订单管理
全面订单管理(全面订单管理) -> http://baike.baidu.com/item/TOM/2044457#viewPageContent
移动互联网公司
移动互联网公司(移动互联网公司) -> http://baike.baidu.com/item/TOM/39488#viewPageContent
化学术语
化学术语(化学术语) -> http://baike.baidu.com/item/TOM/2044489#viewPageContent
同义词
同义词目录 -> http://baike.baidu.com/subview/71844/10028254.htm
我感觉小甲鱼 哪个href少了半个引号的,所以有的网址好像不太对 你自己调试把 我就不改了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-29 08:11:49 | 显示全部楼层
报的什么错?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 08:48:31 | 显示全部楼层

Traceback (most recent call last):
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\baidu.py", line 101, in <module>
    main()
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\baidu.py", line 90, in main
    print(next(each))
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\baidu.py", line 66, in get_urls
    response2 = urllib.request.urlopen(url2)
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\lib\urllib\request.py", line 525, in open
    response = self._open(req, data)
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\lib\urllib\request.py", line 543, in _open
    '_open', req)
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\lib\urllib\request.py", line 1345, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\lib\urllib\request.py", line 1317, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 1244, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 1255, in _send_request
    self.putrequest(method, url, **skips)
  File "C:\Users\xiha\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 1122, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-39: ordinal not in range(128)
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 10:02:14 | 显示全部楼层    本楼为最佳答案   
原来小甲鱼写的时候没有link里边有中文的连接,后边有中文的连接了,所以不行,把他那个keyword在url2哪里输一遍,把汉字编码就好了,改一下就okl了
  1. mport urllib.request
  2. import urllib.parse
  3. import re
  4. from bs4 import BeautifulSoup

  5. def test_url(soup):
  6.     result = soup.find(text=re.compile("百度百科尚未收录词条"))
  7.     if result:
  8.         print(result[0:-1]) # 百度这个碧池在最后加了个“符号,给它去掉
  9.         return False
  10.     else:
  11.         return True

  12. def summary(soup):
  13.     word = soup.h1.text
  14.     # 如果存在副标题,一起打印
  15.     if soup.h2:
  16.         word += soup.h2.text
  17.     # 打印标题
  18.     print(word)
  19.     # 打印简介
  20.     if soup.find(class_="lemma-summary"):
  21.         print(soup.find(class_="lemma-summary").text)   

  22. def get_urls(soup):
  23.     for each in soup.find_all(href=re.compile("view")):
  24.         content = ''.join([each.text])
  25.         print(each.text)
  26.         if '=' in each['href']:
  27.                
  28.             [links,name] = each['href'].split('Name=',2)
  29.             keyname = urllib.parse.urlencode({"Name":name})
  30.             key_link = links + keyname
  31.         else:
  32.             key_link = each['href']
  33.         url2 = ''.join(["http://baike.baidu.com", key_link])
  34.         response2 = urllib.request.urlopen(url2)
  35.         html2 = response2.read()
  36.         soup2 = BeautifulSoup(html2, "html.parser")
  37.         if soup2.h2:
  38.             content = ''.join([content, soup2.h2.text])
  39.         content = ''.join([content, " -> ", url2])
  40.         yield content
  41.         

  42. def main():
  43.     word = input("请输入关键词:")
  44.     keyword = urllib.parse.urlencode({"word":word})
  45.     response = urllib.request.urlopen("https://baike.baidu.com/search/word?%s" % keyword)
  46.     html = response.read()
  47.     soup = BeautifulSoup(html, "html.parser")

  48.     if test_url(soup):
  49.         summary(soup)
  50.         
  51.         print("下边打印相关链接:")
  52.         each = get_urls(soup)
  53.         while True:
  54.             try:
  55.                 for i in range(10):
  56.                     print(next(each))
  57.             except StopIteration:
  58.                 break
  59.             
  60.             command = input("输入任意字符将继续打印,q退出程序:")
  61.             if command == 'q':
  62.                 break
  63.             else:
  64.                 continue
  65.    
  66. if __name__ == "__main__":
  67.     main()

复制代码

这是结果:
请输入关键词:tom
汤姆(美国动画片《猫和老鼠》中的主角)

汤姆(Tom)是米高梅公司制作的经典动画片《猫和老鼠》中的主角之一,70年代老动画中的著名卡通明星角色,是一只蓝灰和白色混合的英国短毛猫。他与小老鼠杰瑞(Jerry)之间可称得上是一对欢喜冤家,二者亦敌亦友,有时互相捣乱,有时互相帮助,有时争论不休,有时团结和谐。他每天忙碌于捉住同住在一起的杰瑞,但总是不如意,总在被耍,憨傻得可爱。生活中充满幽默搞笑,同时也具有抒情与伤情的一幕;主人通常都为两只鞋太太(又黑又胖的女人)。另外,他也爱慕漂亮的千金母猫图多盖洛。有时还被其他成员欺负,如斯派克(Spike)、布奇、莱特宁、托普斯等。

下边打印相关链接:
恐龙百科
恐龙百科 -> http://baike.baidu.com/wikicategory/view?categoryName=%E6%81%90%E9%BE%99%E5%A4%A7%E5%85%A8
多肉百科
多肉百科 -> http://baike.baidu.com/wikicategory/view?categoryName=%E5%A4%9A%E8%82%89%E6%A4%8D%E7%89%A9
里约残奥会吉祥物
里约残奥会吉祥物(里约残奥会吉祥物) -> http://baike.baidu.com/item/TOM/19885318#viewPageContent
名字
名字(名字) -> http://baike.baidu.com/item/TOM/2044473#viewPageContent
全面订单管理
全面订单管理(全面订单管理) -> http://baike.baidu.com/item/TOM/2044457#viewPageContent
移动互联网公司
移动互联网公司(移动互联网公司) -> http://baike.baidu.com/item/TOM/39488#viewPageContent
化学术语
化学术语(化学术语) -> http://baike.baidu.com/item/TOM/2044489#viewPageContent
同义词
同义词目录 -> http://baike.baidu.com/subview/71844/10028254.htm
我感觉小甲鱼 哪个href少了半个引号的,所以有的网址好像不太对 你自己调试把 我就不改了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 10:52:47 | 显示全部楼层
我后来改成这样,就不报错了
  1. import urllib.request
  2. import urllib.parse
  3. import re
  4. from bs4 import BeautifulSoup

  5. def test_url(soup):
  6.     result = soup.find(text=re.compile("百度百科尚未收录词条"))
  7.     if result:
  8.         print(result[0:-1]) # 百度这个碧池在最后加了个“符号,给它去掉
  9.         return False
  10.     else:
  11.         return True

  12. def summary(soup):
  13.     word = soup.h1.text
  14.     # 如果存在副标题,一起打印
  15.     if soup.h2:
  16.         word += soup.h2.text
  17.     # 打印标题
  18.     print(word)
  19.     # 打印简介
  20.     if soup.find(class_="lemma-summary"):
  21.         print(soup.find(class_="lemma-summary").text)   

  22. def get_urls(soup):
  23.     for each in soup.find_all(href=re.compile("view")):

  24.         content = ''.join([each.text])

  25.         url2 = ''.join(["http://baike.baidu.com", each["href"]])
  26.         try:
  27.             response2 = urllib.request.urlopen(url2)
  28.             html2 = response2.read()
  29.             soup2 = BeautifulSoup(html2, "html.parser")
  30.             if soup2.h2:
  31.                 content = ''.join([content, soup2.h2.text])
  32.             content = ''.join([content, " -> ", url2])
  33.             yield content
  34.         except:
  35.             pass
  36.         
  37.         

  38. def main():
  39.     word = input("请输入关键词:")
  40.     keyword = urllib.parse.urlencode({"word":word})
  41.     response = urllib.request.urlopen("https://baike.baidu.com/search/word?%s" % keyword)
  42.     html = response.read()
  43.     soup = BeautifulSoup(html, "html.parser")

  44.     if test_url(soup):
  45.         summary(soup)
  46.         
  47.         print("下边打印相关链接:")
  48.         each = get_urls(soup)
  49.         while True:
  50.             try:
  51.                 for i in range(10):
  52.                     print(next(each))
  53.             except StopIteration:
  54.                 break
  55.             
  56.             command = input("输入任意字符将继续打印,q退出程序:")
  57.             if command == 'q':
  58.                 break
  59.             else:
  60.                 continue
  61.    
  62. if __name__ == "__main__":
  63.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 10:55:02 | 显示全部楼层
Chysial 发表于 2020-3-29 10:02
原来小甲鱼写的时候没有link里边有中文的连接,后边有中文的连接了,所以不行,把他那个keyword在url2哪里 ...

感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 14:38:51 | 显示全部楼层
fresh_python 发表于 2020-3-29 10:52
我后来改成这样,就不报错了

是不报错了,把部分给删了 也能用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 09:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表