python - Beautiful Soup 无法在 html 中找到所有图像标签(恰好在 5 处停止)

标签 python html web-scraping beautifulsoup html-parsing

我正在尝试使用 beautifulsoup 获取具有特定类别的网站的所有图像。我的问题是,当我运行代码只是为了查看我的代码是否可以找到每张图像时,它只会获取图像 1-5。我认为问题是 html,因为图像 6-end 位于嵌套的 div 中,但 Find_all 应该能够找到所有具有相同类的 img。

import requests, os, bs4, sys, webbrowser

url = 'https://mangapanda.onl/chapter/'
os.makedirs('manga', exist_ok=True)

comic = sys.argv[1:]
aComic = '-'.join(sys.argv[1:])  

issue = input('which issue do you want?')
aIssue = ('/chapter-' + issue)
aComic = (aComic + '_110' +  aIssue) 

comicUrl = (url + aComic)
res = requests.get(comicUrl)
res.raise_for_status()

soup = bs4.BeautifulSoup(res.text, 'html.parser')


comicElem = soup.find_all(class_="PB0mN")  
if comicElem == []:
    print('nothing in the list')
else:
    print('There are ' + str(len(comicElem)) + ' on this page')
    for i in range(len(comicElem)):
        comicPage = comicElem[i].get('src')
        print(str(comicPage) + '\n')

在使用可以帮助我解决这个问题的漂亮汤时,我是否遗漏了什么?是导致此问题的 html 吗?有没有更好的方法我可以自己诊断这个问题,这在我的能力范围内(旁注:我目前正在阅读“使用 Python 自动化无聊的东西”一书。这就是我想到这个的地方迷你项目和我对 python 的技能水平的一个体面的想法。最后我正在使用 BeautifulSoup 来了解更多关于它的信息。如果可能的话,我想使用 BeautifulSoup 解决这个问题,如果我需要,我将研究通过 html 解析的其他选项.

使用 firefox quantim 59.0.2 使用 python3

PS,如果您知道可能已经回答了这个问题的其他问题,请随时将我链接到它。我真的很想通过别人的问题找出答案,但我的问题似乎很独特。

最佳答案

问题是一些图像在页面加载后通过 Javascript 添加到 DOM。所以

res = requests.get(comicUrl)

在 javascript 进行任何修改之前获取 HTML 和 DOM。这就是为什么

soup = bs4.BeautifulSoup(res.text, 'html.parser')
comicElem = soup.find_all(class_="PB0mN")
len(comicElem) # = 5

只找到 5 张图片。

如果你想获取所有加载的图像,你不能使用请求库。下面是一个使用 Selenium 的例子:

from selenium import webdriver
browser = webdriver.Chrome('/Users/glenn/Downloads/chromedriver')
comicUrl = "https://mangapanda.onl/chapter/naruto_107/chapter-700.5"
browser.get(comicUrl)
images = browser.find_elements_by_class_name("PB0mN")
for image in images:
    print(image.get_attribute('src'))
len(images) # = 18 images

有关抓取 JavaScript 页面的其他资源,请参阅此帖子: Web-scraping JavaScript page with Python

关于如何判断是否使用 javascript 修改了 HTML?

我没有任何硬性规定,但您可以执行以下调查步骤:

正如您观察到的那样,最初只找到 5 张带有请求的图像,但看到页面上有更多图像是 DOM 在加载后发生更改的第一个线索。

第二步:使用浏览器开发工具 -> 脚本,您可以看到有几个与页面关联的 javascript 文件。请注意,并非所有 javascript 都会修改 DOM,因此这些脚本的存在并不一定意味着它们正在修改 DOM。

为了进一步验证 DOM 在页面加载后被修改:

从 Developer Tools -> View Page Source 复制 html 到 HTML 格式化工具,如 http://htmlformatter.com ,格式化 html 并查看行数。 Developer Tools -> View Page Source 是服务器发送的html,没有任何修改。

然后从 Developer Tools -> Elements 复制 html(确保从 <html>...</html> 中获取全部内容)并将其复制到 HTML 格式化程序工具中,例如 http://htmlformatter.com , 格式化并查看行数。 Developer Tools -> Elements html 是完整的修改后的 DOM。

如果行数明显不同,那么您就知道 DOM 在加载后被修改了。

比较“https://mangapanda.onl/chapter/naruto_107/chapter-700.5”的行数显示源 html 有 479 行,完整 DOM 有 3245 行,因此您知道在加载页面后某些东西正在修改 DOM。

关于python - Beautiful Soup 无法在 html 中找到所有图像标签(恰好在 5 处停止),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50014456/

相关文章:

python:国际象棋移动验证

javascript - 使容器在消失后出现并带有按钮

javascript - 手机自动播放直播

Python 使用 beautifulsoup 从复杂的论坛中抓取最后发布日期

java - 空对象引用上的“java.lang.String org.jsoup.nodes.Element.text()”

python - 使 Altair 散点图分配不同的颜色而不是相同颜色的阴影

python - Python 中的 Karatsuba 算法

python - 在不同的控制台窗口中启动进程

javascript - 滚动传递时如何隐藏div/元素?

python - 使用请求库临时检索图像