返回列表 发帖

[问题求助] [已解决]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库COPY

use Mojo::DOM;
use Encode;
my $dom = Mojo::DOM->new( $html );
grep { printf "%s\n", encode('gbk', $_)  } @{ $dom->find(".blkContainer td[colspan]")->map("text") };COPY
乱入
[url=][/url]

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

回复 11# netdzb


    是的

TOP

回复 10# wxyz0001

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

TOP

回复 9# netdzb


    css的class里有空格用bs4读不出,另外,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

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

回复 7# wxyz0001

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

TOP

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

TOP

本帖最后由 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')COPY

TOP

回复 4# wxyz0001

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

TOP

我换parsel库解决了这个问题

TOP

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

回复 1# wxyz0001

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

TOP

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

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

TOP

返回列表