标题: [问题求助] [已解决]Python用bs4爬取网页代码,找不到DIV标签 [打印本页]
作者: wxyz0001 时间: 2021-5-23 12:33 标题: [已解决]Python用bs4爬取网页代码,找不到DIV标签
本帖最后由 wxyz0001 于 2021-5-23 16:35 编辑
- 用 soup.find('div', class_='blkContainerSblkCon')可以找到DIV标签
- for line in soup.find('div', class_='blkContainerSblkCon').find_all(name='p'):
- 但是class里有空格 soup.find('div', class_='left conten')又找不到
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 网上说class里有空格,可以用.代替空格就可以找到,但是不行
- 用soup.find('div.blkContainerSblkCon')找不到
- 用soup.find('div.left.conten')找不到
- 为什么找不到呢,难道我的是个假BeautifulSoup库
复制代码
作者: 523066680 时间: 2021-5-23 12:48
你倒是把网页代码发一段出来,不然让别人猜具体情况咩
html 标签里的 class 内容有空格,表示多个class ID,选其中一个就可以。
<div class="left conten">
在Perl的Mojolicous模块,可以通过 find("div.left") 来锚定
作者: netdzb 时间: 2021-5-23 13:41
本帖最后由 netdzb 于 2021-5-23 14:00 编辑
回复 1# wxyz0001
请帖一下问题相关的代码,说明问题。
还有你抓的网页是什么编码的?
你把你要解析的网页也贴出来呀。
作者: wxyz0001 时间: 2021-5-23 16:34
我换parsel库解决了这个问题
作者: netdzb 时间: 2021-5-23 19:33
回复 4# wxyz0001
你把网页贴出来,我可以试试看。同样还可以用xpath,
我一直没有写python了,应该及时复习一下了。
作者: wxyz0001 时间: 2021-5-23 20:20
本帖最后由 wxyz0001 于 2021-5-24 10:00 编辑
回复 5# netdzb
我最后一篇不知道为什么没有写入,另外乱码不知道怎么解决,有好几种编码
你看看这两个问题能否解决- import requests
- import parsel
-
- # ●爬取网页代码框架
- def getHTMLText(url):
- try:
- r = requests.get(url, timeout=30)
- r.raise_for_status()
- r.encoding = r.apparent_encoding
- return r.text
- except:
- return "产生异常"
-
- # ●目标网址
- url = 'https://www.dzwzzz.com/jingxuan'
- # 网页选择器
- def get_link_title(url):
- html = getHTMLText(url)
- infoDict = {}
- sel = parsel.Selector(html)
-
- # 获取所有链接
- links = sel.css('.blkContainerSblkCon a::attr(href)').getall()
- # 获取所有标题
- titles = sel.css('.blkContainerSblkCon a::text').getall()
- for i in range(len(links)):
- key = links[i]
- val = titles[i]
- key = 'https://www.dzwzzz.com' + key[key.index('..') + 2:key.index('html')] + 'html'
- infoDict[key] = val
- return infoDict
-
- def get_chapter_text(url):
- content = getHTMLText(url)
- strs = ""
- sel = parsel.Selector(content)
- try:
- lines = sel.css('.blkContainerSblkCon p::text').getall()
- for i in range(len(lines)):
- strs += lines + '\n'
- lines = sel.css('.mt20.f14 p::text').getall()
- for i in range(len(lines)):
- strs += lines + '\n'
- lines = sel.css('.mt20.f12 p::text').getall()
- for i in range(len(lines)):
- strs += lines + '\n'
- except:
- print('获取不到div标签')
- pass
- return strs
-
- length = len(get_link_title(url))
- count = 0
- for key, val in get_link_title(url).items():
- count += 1
- print('正在打印第%d篇' % count, '总共有%d篇' % length)
- url, title = key, val
- with open('读者文摘.txt', 'a', encoding='utf-8') as f:
- f.write('##' + title + '\n' + get_chapter_text(url) + '\n')
复制代码
作者: wxyz0001 时间: 2021-5-23 20:43
我知道为什么最后一篇没有写入了,刚查看了一下,有好几篇都没有写入。原因是文本用的是div标签,不是用的p标签,这个可以用判断来解决。
但是网页乱码不好解决,这么多网页有好几种编码。
作者: netdzb 时间: 2021-5-23 21:03
本帖最后由 netdzb 于 2021-5-23 21:49 编辑
回复 7# wxyz0001
我上来看了一下,提供网页的url是utf-8编码的。你主题贴提到的<p>标签只有一个啊。
到底需要提取哪些信息?
作者: netdzb 时间: 2021-5-23 22:05
回复 7# wxyz0001
简化一下问题,定义一个html,你bs4解析的时候的遇到了什么问题?
html = '''<div class="blkContainerSblkCon">
<table class="booklist">
<tbody><tr class="category">
<td colspan="1">2020年精选</td>
</tr>
<tr>
<td class="title"><a target="_blank" href="https://www.dzwzzz.com/2020_06/duzh20200623.html" title="在抗疫前线的父母">在抗疫前线的父母
</a></td>
<td class="author" title="林少娟">林少娟</td>
<td class="source" title="微信公众号“南都周刊”">微信公众号“南都周刊”</td>
</tr>
<tr>
<td class="title"><a target="_blank" href="https://www.dzwzzz.com/2020_05/duzh20200534.html" title="最后的5%是关键">最后的5%是关键
</a></td>
<td class="author" title="〔日〕石川拓治">〔日〕石川拓治</td>
<td class="source" title="上海文艺出版社《天才主厨的绝对温度》一书">上海文艺出版社《天才主厨的绝对温度》一书</td>
</tr>
</tbody>
</table>
</div>'''
作者: wxyz0001 时间: 2021-5-23 22:20
回复 9# netdzb
css的class里有空格用bs4读不出,另外,p标签怎么会只有一个?
作者: netdzb 时间: 2021-5-23 23:20
回复 10# wxyz0001
你是说
<table class="booklist">
如果是这样的会读不出来
<table class="book list">
作者: wxyz0001 时间: 2021-5-23 23:27
回复 11# netdzb
是的
作者: netdzb 时间: 2021-5-24 00:26
回复 12# wxyz0001
我下面的代码是可以通过的
from bs4 import BeautifulSoup
html = '''<div class="blkContainer SblkCon">
<table class="booklist">
<tbody><tr class="category">
<td colspan="1">2020年精选1</td>
<td colspan="2">2020年精选2</td>
</tr>
<tr>
<td class="title"><a target="_blank" href="https://www.dzwzzz.com/2020_06/duzh20200623.html" title="在抗疫前线的父母">在抗疫前线的父母
</a></td>
<td class="author" title="林少娟">林少娟</td>
<td class="source" title="微信公众号“南都周刊”">微信公众号“南都周刊”</td>
</tr>
<tr>
<td class="title"><a target="_blank" href="https://www.dzwzzz.com/2020_05/duzh20200534.html" title="最后的5%是关键">最后的5%是关键
</a></td>
<td class="author" title="〔日〕石川拓治">〔日〕石川拓治</td>
<td class="source" title="上海文艺出版社《天才主厨的绝对温度》一书">上海文艺出版社《天才主厨的绝对温度》一书</td>
</tr>
</tbody>
</table>
</div>'''
soup = BeautifulSoup(html,"html.parser")
#addr = soup.find_all('booklist').find_all('category')
addr = soup.find('div', class_='blkContainer SblkCon').find('table', class_='booklist').find('tr',class_='category').find_all('td')
print(addr)
===========
<td colspan="1">2020年精选1</td>
<td colspan="2">2020年精选2</td>
如果我我想输出
===>
2020年精选1
2020年精选2
正确的代码应该怎么写?
作者: 523066680 时间: 2021-5-24 01:32
- use Mojo::DOM;
- use Encode;
- my $dom = Mojo::DOM->new( $html );
- grep { printf "%s\n", encode('gbk', $_) } @{ $dom->find(".blkContainer td[colspan]")->map("text") };
复制代码
乱入
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |