鱼C论坛

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

[已解决]BeautifulSoup

[复制链接]
发表于 2017-5-25 14:45:02 | 显示全部楼层 |阅读模式

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

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

x
import urllib.request
>>> from bs4 import BeautifulSoup
>>> url = 'http://baike.baidu.com/view/284853.htm'
>>> response = urllib.request.urlopen(url)
>>> html = response.read()
>>> soup = BeautifulSoup(html,'html.parser')
>>> import re
>>> for each in soup.find_all(href=re.sompile('view')):
        print(each.text,'->',''.join(['http://baike.baidu.com',\ each['href']]))
       
SyntaxError: unexpected character after line continuation character



最后一句报错是为什么,书上不就是这么写的么
最佳答案
2017-5-25 14:54:23
print(each.text,'->',''.join(['http://baike.baidu.com',\ each['href']]))
这句应该缩进,你没有缩进
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-25 14:54:23 | 显示全部楼层    本楼为最佳答案   
print(each.text,'->',''.join(['http://baike.baidu.com',\ each['href']]))
这句应该缩进,你没有缩进
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-25 15:14:57 | 显示全部楼层
gopythoner 发表于 2017-5-25 14:54
print(each.text,'->',''.join(['http://baike.baidu.com',\ each['href']]))
这句应该缩进,你没有缩进

keyword = input('请输入关键词:')
    keyword = urllib.parse.urlencode({'word':keyword})
    response = \
urllib.request.urlopen('http://baike.baidu.com/search/word? % s' % \
keyword)

不懂最后一句会报语法格式错误,麻烦解答一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-25 15:41:45 | 显示全部楼层
小木子c 发表于 2017-5-25 15:14
keyword = input('请输入关键词:')
    keyword = urllib.parse.urlencode({'word':keyword})
    re ...

首先,你把你的代码用代码的格式复制过来,怎么用?你看到论坛编辑里面的<>了么?就在表情的左边,就是这个,把代码复制到这里面,形式是这样的
  1. keyword = input('请输入关键词:')
复制代码

然后,你要把出错的代码前后部分都复制过来,特别是报错的显示

最后,我看你这代码写的真乱,不该缩进的地方乱缩进,不需要换行的地方乱换行,看的真乱(形成这种很乱的原因是你不知道格式,都是复制的对吧,这样不对!)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-25 17:54:24 | 显示全部楼层
gopythoner 发表于 2017-5-25 15:41
首先,你把你的代码用代码的格式复制过来,怎么用?你看到论坛编辑里面的了么?就在表情的左边,就是这个 ...
  1. import urllib.request
  2. import urllib.parse
  3. import re
  4. from bs4 import BeautifulSoup


  5. def main():
  6.     keyword = input('请输入关键词:')
  7.     keyword = urllib.parse.urlencode({'word':keyword})
  8.     response = \
  9. urllib.request.urlopen('http://baike.baidu.com/item/word? % s' % \
  10. keyword)
  11.     html = response.read()
  12.     soup = BeautifulSoup(html,'html.parser')

  13.     for each in soup.find_all(href = re.compile('view')):
  14.         content = ''.join([each.text])
  15.         url2 = ''.join(['http://baike.baidu.com',each['href']])
  16.         response2 = urllib.request.urlopen(url2)
  17.         html2 = response2.read()
  18.         soup2 = BeautifulSoup(html2,'html.parse')
  19.         if soup2.h2:
  20.             content = ''.join([content,soup2.h2.text])
  21.         content = ''.join([content,'->',url2])
  22.         print(content)

  23. if __name__ == '__main__':
  24.     main()
复制代码



报错:
Traceback (most recent call last):
  File "C:\Users\Python练习\BeautifulSoup.py", line 28, in <module>
    main()
  File "C:\Users\Python练习\BeautifulSoup.py", line 12, in main
    keyword)
  File "C:\Python32\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python32\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Python32\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python32\lib\urllib\request.py", line 570, in error
    return self._call_chain(*args)
  File "C:\Python32\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Python32\lib\urllib\request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-25 18:07:38 | 显示全部楼层
  1. urllib.request.urlopen('http://baike.baidu.com/item/word? % s' % \
  2. keyword)
复制代码


这句出错了,错误的原因的构造的链接错误,你可以打印一下这个构造之后的链接,看看跟你从网页上面直接看到的是不是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-25 21:23:29 | 显示全部楼层
gopythoner 发表于 2017-5-25 18:07
这句出错了,错误的原因的构造的链接错误,你可以打印一下这个构造之后的链接,看看跟你从网页上面直接 ...

请输入关键词:猪八戒
http://baike.baidu.com/search/word? word=%E7%8C%AA%E5%85%AB%E6%88%92

构造的链接如上,这个链接可以访问,虽然跟直接用百度百科搜索的网址的确是不一样,但最后出现的页面是相同的,你可以试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-25 21:27:35 | 显示全部楼层
gopythoner 发表于 2017-5-25 18:07
这句出错了,错误的原因的构造的链接错误,你可以打印一下这个构造之后的链接,看看跟你从网页上面直接 ...

这里我把item改成了search,不过还是会报同样的错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-25 23:21:13 | 显示全部楼层
小木子c 发表于 2017-5-25 21:27
这里我把item改成了search,不过还是会报同样的错误

我试了一下你这个代码,请求无效
需要加上请求头,也就是headers才能请求成功,看我换个方式请求的结果
  1. import urllib.request
  2. import urllib.parse
  3. import re
  4. import requests
  5. from bs4 import BeautifulSoup


  6. def main():
  7.     headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
  8.                              ' (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
  9.     keyword = input('请输入关键词:')
  10.     keyword = urllib.parse.urlencode({'word':keyword})
  11.     # response = urllib.request.urlopen('http://baike.baidu.com/item/word? % s' % keyword)
  12.     # html = response.read()
  13.     url = 'http://baike.baidu.com/item/word?%s' % keyword
  14.     print(url)
  15.     html = requests.get(url,headers=headers).text
  16.     soup = BeautifulSoup(html,'lxml')

  17.     for each in soup.find_all(href = re.compile('view')):
  18.         content = ''.join([each.text])
  19.         url2 = ''.join(['http://baike.baidu.com',each['href']])
  20.         response2 = urllib.request.urlopen(url2)
  21.         html2 = response2.read()
  22.         soup2 = BeautifulSoup(html2,'lxml')
  23.         if soup2.h2:
  24.             content = ''.join([content,soup2.h2.text])
  25.         content = ''.join([content,'->',url2])
  26.         print(content)

  27. if __name__ == '__main__':
  28.     main()
复制代码


自己看我改动的地方吧,自己去查怎么添加头信息

我请求的结果是这样的
  1. 请输入关键词:猪八戒
  2. http://baike.baidu.com/item/word?word=%E7%8C%AA%E5%85%AB%E6%88%92
  3. &#229;¤&#154;&#228;1&#137;èˉ&#141;目录->http://baike.baidu.com/view/10812277.htm
  4. &#228;1&#137;é&#161;1目录->http://baike.baidu.com/view/340519.htm
  5. è&#139;±&#230;&#150;&#135;&#229;&#141;&#149;èˉ&#141;(英文单词)->http://baike.baidu.com/subview/23213/10707247.htm#viewPageContent
  6. &#231;&#188;&#150;&#231;¨&#139;èˉ-è¨&#128;&#228;&#184;-&#231;&#154;&#132;&#228;&#184;&#128;&#231;§&#141;&#230;&#149;°&#230;&#141;&#174;&#231;±&#187;&#229;&#158;&#139;(编程语言中的一种数据类型)->http://baike.baidu.com/subview/23213/11083998.htm#viewPageContent
  7. Java&#229;&#136;&#134;&#229;&#184;&#131;&#229;&#188;&#143;&#228;&#184;-&#230;&#150;&#135;&#229;&#136;&#134;èˉ&#141;&#231;&#187;&#132;&#228;&#187;&#182;(Java分布式中文分词组件)->http://baike.baidu.com/item/word/17575520#viewPageContent
  8. é&#148;&#129;&#229;&#174;&#154;->http://baike.baidu.com/view/10812319.htm
  9. &#229;&#144;&#140;&#228;1&#137;èˉ&#141;目录->http://baike.baidu.com/subview/71844/10028254.htm
复制代码



前面都是乱码,这说明你后面的代码也有问题,跟编码有关,这个我没怎么看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 10:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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