python爬取小说后部分内容乱码

下面是代码

import requests
import os
import lxml
from bs4 import BeautifulSoup

if __name__ == '__main__':
    url = 'https://www.linovelib.com/novel/2547/catalog'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
    }
    page_text = requests.get(url=url, headers=headers).text

    soup = BeautifulSoup(page_text, 'lxml')
    li_list = soup.select('.volume-list ul')
    li_list = li_list[0]
    li_list = str(li_list).split('\n')
    print(li_list)
    li_list1 = soup.select('.volume-list ul > div')
    li_list2 = soup.select('.volume-list li')
    Number1 = -1;
    Number2 = -1;

    for li in li_list:
        if 'v-line' in li:
            print('2')
            Number1 = Number1 + 1;
            if Number1 < 9:
                if not os.path.exists('./' + str(li_list1[Number1].text)):
                    os.mkdir('./' + str(li_list1[Number1].text))

        elif 'href' in li:
            if Number2 < 2:
                print('1')
                Number2 = Number2 + 1
                href = 'https://www.linovelib.com' + li_list2[Number2].a['href']
                href_page = requests.get(url=href, headers=headers, )
                href_page.encoding = 'utf-8'
                href_page_text = href_page.text

                href_soup = BeautifulSoup(href_page_text, 'lxml')
                href_list = href_soup.find('div', id='mlfy_main_text')
                content = href_list.text
                print(content)

                fileName = './' + str(li_list1[Number1].text) + '/' + str(li_list2[Number2].a.string) + '.text'
                fp = open(fileName, 'w', encoding='utf-8')
                fp.write(content)

    print("nb")



然后下面是执行的部分结果

python爬取小说后部分内容乱码
这种情况算乱码吗

Jason990420
最佳答案

你抓下来的只是页面的源代码

真昼光润的嘴\ue863中吐\ue821叹息。即使\ue843此,\ue820\ue822\ue840有回\ue82f,\ue82c是\ue845周带\ue80f了寝室。
中途两人\ue846差点摔倒,\ue80a让\ue845屋子弄\ue823\ue80a\ue838乱的本人\ue822深切体认\ue80f,\ue826己再不认真收拾房间就不妙了。
「我先\ue821\ue82f一\ue82b,你就在我回\ue80e\ue839前换\ue83b衣服。\ue840问题吧?」
「……你\ue846\ue81f回\ue80e啊。」
「放着卧床不\ue83d的人不管,我\ue828睡不\ue83b觉的。」
真昼冷淡\ue812回答,似乎\ue81e周\ue80c次\ue83c\ue80f\ue820淋湿那\ue810有着一\ue849的\ue84b法,所\ue827他\ue822无法再\ue833说什\ue838。
等\ue80f\ue820离\ue84e房间\ue839\ue825,周就老实\ue812照\ue820所说,换\ue80c\ue829居服。
「真是乱七八糟,根本\ue840有走路的\ue812方……\ue813什\ue838\ue80a\ue849\ue846\ue830生活呢……」

事实上该内容可能有经以下 javascript 代码置换成最后显示的页面内容, 我不懂 javascript, 所以要你自己去看它们如何置换成最后的结果.

<head>
...
<script language="javascript" type="text/javascript" src="https://www.linovelib.com/themes/zhpc/js/pctheme.js?v0620a5">
...
</head>

In pctheme.js

    k = document.getElementById("TextContent").innerHTML,
    ...
    document.getElementById("TextContent").innerHTML = k

Try to get the text by selenium

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(r'D:\Python\Project\chromedriver.exe')

driver.get("https://www.linovelib.com/novel/2547/92960.html")
element = driver.find_element(by=By.ID, value='mlfy_main_text')
print(element.text)

driver.close()
1年前 评论
Jason990420 (作者) 1年前
A_Starry_Sky (楼主) 1年前
Jason990420 (作者) 1年前
A_Starry_Sky (楼主) 1年前
讨论数量: 8
Jason990420

你抓下来的只是页面的源代码

真昼光润的嘴\ue863中吐\ue821叹息。即使\ue843此,\ue820\ue822\ue840有回\ue82f,\ue82c是\ue845周带\ue80f了寝室。
中途两人\ue846差点摔倒,\ue80a让\ue845屋子弄\ue823\ue80a\ue838乱的本人\ue822深切体认\ue80f,\ue826己再不认真收拾房间就不妙了。
「我先\ue821\ue82f一\ue82b,你就在我回\ue80e\ue839前换\ue83b衣服。\ue840问题吧?」
「……你\ue846\ue81f回\ue80e啊。」
「放着卧床不\ue83d的人不管,我\ue828睡不\ue83b觉的。」
真昼冷淡\ue812回答,似乎\ue81e周\ue80c次\ue83c\ue80f\ue820淋湿那\ue810有着一\ue849的\ue84b法,所\ue827他\ue822无法再\ue833说什\ue838。
等\ue80f\ue820离\ue84e房间\ue839\ue825,周就老实\ue812照\ue820所说,换\ue80c\ue829居服。
「真是乱七八糟,根本\ue840有走路的\ue812方……\ue813什\ue838\ue80a\ue849\ue846\ue830生活呢……」

事实上该内容可能有经以下 javascript 代码置换成最后显示的页面内容, 我不懂 javascript, 所以要你自己去看它们如何置换成最后的结果.

<head>
...
<script language="javascript" type="text/javascript" src="https://www.linovelib.com/themes/zhpc/js/pctheme.js?v0620a5">
...
</head>

In pctheme.js

    k = document.getElementById("TextContent").innerHTML,
    ...
    document.getElementById("TextContent").innerHTML = k

Try to get the text by selenium

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(r'D:\Python\Project\chromedriver.exe')

driver.get("https://www.linovelib.com/novel/2547/92960.html")
element = driver.find_element(by=By.ID, value='mlfy_main_text')
print(element.text)

driver.close()
1年前 评论
Jason990420 (作者) 1年前
A_Starry_Sky (楼主) 1年前
Jason990420 (作者) 1年前
A_Starry_Sky (楼主) 1年前

昨天看了一下尝试了多种解码方式 发现页面应该是做了字体反扒,如果需要可以去了解下机制

1年前 评论
miusa166 (作者) 1年前
import requests
from lxml import etree

url = 'https://w.linovelib.com/novel/2547/catalog'

page_text = requests.get(url=url).content.decode('utf-8')

url_str = 'https://w.linovelib.com'

tree = etree.HTML(page_text)
host_li_list = tree.xpath('//*[@class="chapter-li jsChapter"]')
for host in host_li_list:

    host_li_name = host.xpath('./a/span/text()')  # 提取章节名称
    host_li_value = host.xpath('./a/@href')[0]  # 提取章节地址
    chapter_url = url_str + host_li_value  # 拼接章节地址
    chapter_page_text = requests.get(url=chapter_url).content.decode('utf8')

    chapter_tree = etree.HTML(chapter_page_text)

    chapter_list = chapter_tree.xpath('//*[@id="acontent"]/p')
    chapter_str = ''
    text_list = []
    for chapter in chapter_list:
        chapter_text = chapter.xpath('./text()')[0]
        text_list.append(chapter_text)
    all_chapter = chapter_str.join(text_list)
    with open(f'./text/{host_li_name}.txt', 'w', encoding='utf-8') as f:
        f.write(all_chapter)
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!