鱼C论坛

 找回密码
 立即注册
查看: 1354|回复: 8

[已解决]第55讲动动手题1

[复制链接]
发表于 2020-8-7 18:37:17 | 显示全部楼层 |阅读模式

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

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

x
import re
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

def main():
    word = input('请输入搜索关键字: ')
    key = urllib.parse.urlencode({'word':word}).encode('utf-8')
    response = urllib.request.urlopen('http://baike.baidu.com/search/word?%s' % key)
    html = response.read().decode('utf-8')
    soup = BeautifulSoup(html, 'html.parser')

    for each in soup.find_all(href=re.compile('view')):
        content = ''.join([each.text])
        url2 = ''.join(['http://baike.baidu.com/', each['href']])
        response2 = urllib.request.urlopen(url2)
        html2 = response2.read()
        soup2 = BeautifulSoup(html2)

        if soup2.h2:
            content = ''.join([content, soup2.h2.text])
        content = ' '.join([content, '->', url2])
        print(content)

if __name__ == '__main__':
    main()

UnicodeEncodeError: 'ascii' codec can't encode characters in position 37-40: ordinal not in range(128)
为什么运行结果会出错?怎样避免这类错误?
最佳答案
2020-8-7 18:39:18
import re
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

def main():
    word = input('请输入搜索关键字: ')
    key = urllib.parse.urlencode({'word':word}).encode('utf-8')
    response = urllib.request.urlopen('http://baike.baidu.com/search/word?%s' % key)
    html = response.read().decode('utf-8')
    soup = BeautifulSoup(html, 'html.parser')

    for each in soup.find_all(href=re.compile('view')):
        content = ''.join([each.text])
        url2 = ''.join(['https://baike.baidu.com/', urllib.parse.quote(each['href'])])
        response2 = urllib.request.urlopen(url2)
        html2 = response2.read()
        soup2 = BeautifulSoup(html2, 'html.parser')

        if soup2.h2:
            content = ''.join([content, soup2.h2.text])
        content = ' '.join([content, '->', url2])
        print(content)

if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-7 18:38:13 | 显示全部楼层
本帖最后由 Twilight6 于 2020-8-7 18:39 编辑


按照这里来改就行,
soup.find_all(href=re.compile("view")) 改成 soup.find_all(href=re.compile("item"))[7:-1]


055课 爬百度百科“网络爬虫”的词条 问题
https://fishc.com.cn/thread-169631-1-1.html
(出处: 鱼C论坛)

参考代码:
import re
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

def main():
    word = input('请输入搜索关键字: ')
    key = urllib.parse.urlencode({'word':word}).encode('utf-8')
    response = urllib.request.urlopen('http://baike.baidu.com/search/word?%s' % key)
    html = response.read().decode('utf-8')
    soup = BeautifulSoup(html, 'html.parser')

    for each in soup.find_all(href=re.compile("item"))[7:-1]:
        content = ''.join([each.text])
        url2 = ''.join(['http://baike.baidu.com/', each['href']])
        response2 = urllib.request.urlopen(url2)
        html2 = response2.read()
        soup2 = BeautifulSoup(html2)

        if soup2.h2:
            content = ''.join([content, soup2.h2.text])
        content = ' '.join([content, '->', url2])
        print(content)

if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-7 18:39:18 | 显示全部楼层    本楼为最佳答案   
import re
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

def main():
    word = input('请输入搜索关键字: ')
    key = urllib.parse.urlencode({'word':word}).encode('utf-8')
    response = urllib.request.urlopen('http://baike.baidu.com/search/word?%s' % key)
    html = response.read().decode('utf-8')
    soup = BeautifulSoup(html, 'html.parser')

    for each in soup.find_all(href=re.compile('view')):
        content = ''.join([each.text])
        url2 = ''.join(['https://baike.baidu.com/', urllib.parse.quote(each['href'])])
        response2 = urllib.request.urlopen(url2)
        html2 = response2.read()
        soup2 = BeautifulSoup(html2, 'html.parser')

        if soup2.h2:
            content = ''.join([content, soup2.h2.text])
        content = ' '.join([content, '->', url2])
        print(content)

if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-7 20:43:53 | 显示全部楼层

确实可以运行了!感谢!
但是还想问一下,为啥这里要用urllib.parse.quote, 而不是each['href']?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-7 20:44:47 | 显示全部楼层
Twilight6 发表于 2020-8-7 18:38
按照这里来改就行,

055课 爬百度百科“网络爬虫”的词条 问题

可以运行,但为啥还有错误?
UnicodeEncodeError: 'ascii' codec can't encode characters in position 34-42: ordinal not in range(128)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-7 20:45:41 | 显示全部楼层
sharank 发表于 2020-8-7 20:43
确实可以运行了!感谢!
但是还想问一下,为啥这里要用urllib.parse.quote, 而不是each['href']?

因为 url 中带有中文字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-7 21:07:41 | 显示全部楼层
zltzlt 发表于 2020-8-7 20:45
因为 url 中带有中文字符

好的,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-7 22:25:13 | 显示全部楼层
Twilight6 发表于 2020-8-7 18:38
按照这里来改就行,

055课 爬百度百科“网络爬虫”的词条 问题

为啥这里是item呀?而且还是[7:-1]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-7 23:53:05 | 显示全部楼层
解决了!!!
其实把re.compile('view')改成re.compile('\#view')就可以了
不过还是得看需求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 14:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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