[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] [已解决]Python用bs4爬取网页代码,找不到DIV标签

本帖最后由 wxyz0001 于 2021-5-23 16:35 编辑
  1. 用 soup.find('div', class_='blkContainerSblkCon')可以找到DIV标签
  2. for line in soup.find('div', class_='blkContainerSblkCon').find_all(name='p'):
  3. 但是class里有空格 soup.find('div', class_='left conten')又找不到
  4. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  5. 网上说class里有空格,可以用.代替空格就可以找到,但是不行
  6. 用soup.find('div.blkContainerSblkCon')找不到
  7. 用soup.find('div.left.conten')找不到
  8. 为什么找不到呢,难道我的是个假BeautifulSoup库
复制代码

你倒是把网页代码发一段出来,不然让别人猜具体情况咩

html 标签里的 class 内容有空格,表示多个class ID,选其中一个就可以。
<div class="left conten">
在Perl的Mojolicous模块,可以通过 find("div.left") 来锚定

TOP

本帖最后由 netdzb 于 2021-5-23 14:00 编辑

回复 1# wxyz0001

请帖一下问题相关的代码,说明问题。
还有你抓的网页是什么编码的?
你把你要解析的网页也贴出来呀。

TOP

我换parsel库解决了这个问题

TOP

回复 4# wxyz0001

你把网页贴出来,我可以试试看。同样还可以用xpath,
我一直没有写python了,应该及时复习一下了。

TOP

本帖最后由 wxyz0001 于 2021-5-24 10:00 编辑

回复 5# netdzb


    我最后一篇不知道为什么没有写入,另外乱码不知道怎么解决,有好几种编码
你看看这两个问题能否解决
  1. import requests
  2. import parsel
  3. # ●爬取网页代码框架
  4. def getHTMLText(url):
  5.     try:
  6.         r = requests.get(url, timeout=30)
  7.         r.raise_for_status()
  8.         r.encoding = r.apparent_encoding
  9.         return r.text
  10.     except:
  11.         return "产生异常"
  12. # ●目标网址
  13. url = 'https://www.dzwzzz.com/jingxuan'
  14. # 网页选择器
  15. def get_link_title(url):
  16.     html = getHTMLText(url)
  17.     infoDict = {}
  18.     sel = parsel.Selector(html)
  19.     # 获取所有链接
  20.     links = sel.css('.blkContainerSblkCon a::attr(href)').getall()
  21.     # 获取所有标题
  22.     titles = sel.css('.blkContainerSblkCon a::text').getall()
  23.     for i in range(len(links)):
  24.         key = links[i]
  25.         val = titles[i]
  26.         key = 'https://www.dzwzzz.com' + key[key.index('..') + 2:key.index('html')] + 'html'
  27.         infoDict[key] = val
  28.     return infoDict
  29. def get_chapter_text(url):
  30.     content = getHTMLText(url)
  31.     strs = ""
  32.     sel = parsel.Selector(content)
  33.     try:
  34.         lines = sel.css('.blkContainerSblkCon p::text').getall()
  35.         for i in range(len(lines)):
  36.             strs += lines + '\n'
  37.         lines = sel.css('.mt20.f14 p::text').getall()
  38.         for i in range(len(lines)):
  39.             strs += lines + '\n'
  40.         lines = sel.css('.mt20.f12 p::text').getall()
  41.         for i in range(len(lines)):
  42.             strs += lines + '\n'
  43.     except:
  44.         print('获取不到div标签')
  45.         pass
  46.     return strs
  47. length = len(get_link_title(url))
  48. count = 0
  49. for key, val in get_link_title(url).items():
  50.     count += 1
  51.     print('正在打印第%d篇' % count, '总共有%d篇' % length)
  52.     url, title = key, val
  53.     with open('读者文摘.txt', 'a', encoding='utf-8') as f:
  54.         f.write('##' + title + '\n' + get_chapter_text(url) + '\n')
复制代码

TOP

我知道为什么最后一篇没有写入了,刚查看了一下,有好几篇都没有写入。原因是文本用的是div标签,不是用的p标签,这个可以用判断来解决。
但是网页乱码不好解决,这么多网页有好几种编码。

TOP

本帖最后由 netdzb 于 2021-5-23 21:49 编辑

回复 7# wxyz0001

我上来看了一下,提供网页的url是utf-8编码的。你主题贴提到的<p>标签只有一个啊。
到底需要提取哪些信息?

TOP

回复 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>'''

TOP

回复 9# netdzb


    css的class里有空格用bs4读不出,另外,p标签怎么会只有一个?

TOP

回复 10# wxyz0001

你是说
<table class="booklist">
如果是这样的会读不出来
<table class="book list">

TOP

回复 11# netdzb


    是的

TOP

回复 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

正确的代码应该怎么写?

TOP

  1. use Mojo::DOM;
  2. use Encode;
  3. my $dom = Mojo::DOM->new( $html );
  4. grep { printf "%s\n", encode('gbk', $_)  } @{ $dom->find(".blkContainer td[colspan]")->map("text") };
复制代码
乱入

TOP

返回列表