即使有25个相同的类,也获得输出0

时间:2018-04-04 13:09:52

标签: python python-3.x python-2.7 beautifulsoup

Image of the HTML

Link to the page

我试图看看这个页面上有多少类,但输出为0.我一直在使用BeautifulSoup,但从未看到过这样的错误。

from bs4 import BeautifulSoup
import requests

result = requests.get("https://www.holonis.com/motivationquotes")
c = result.content

soup = BeautifulSoup(c)
samples = soup.findAll("div", {"class": "ng-scope"})
print(len(samples))

输出

0

我想要正确的输出至少超过25

5 个答案:

答案 0 :(得分:1)

基本上,result.content不包含ng-scope类的任何div。正如其中一条评论中所述,由于浏览器上运行了javascript,因此您要添加的html会被添加到其中。

我建议您使用非常受欢迎的requests-html作者创建的此程序包requests

您可以尝试使用下面的代码来构建它。

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://www.holonis.com/motivationquotes')
r.html.render()

要查看有多少ng-scope个类,请执行以下操作:

>>> len(r.html.find('.ng-scope'))
302

我假设您要从href标记中抓取所有a s,这些标记是您提供image的div的子项。你可以这样获得它们:

divs = r.html.find('[ng-if="!isVideo"]')
link_sets = (div.absolute_links for div in divs)

>>> list(set(chain.from_iterable(link_sets)))
['https://www.holonis.com/motivationquotes/o/byiqe-ydm',
 'https://www.holonis.com/motivationquotes/o/rkhv0uq9f',
 'https://www.holonis.com/motivationquotes/o/ry7ra2ycg',
 ...
 'https://www.holonis.com/motivationquotes/o/sydzfwgcz',
 'https://www.holonis.com/motivationquotes/o/s1eidcdqf']

答案 1 :(得分:1)

这是一个“动态”基于角色的页面,需要Javascript引擎或浏览器才能完全加载。换句话说 - 您在浏览器开发人员工具中看到的HTML源代码与您在result.content中看到的不同 - 后者是页面的非呈现初始HTML,不包含所需的数据

您可以使用selenium之类的内容来渲染和加载页面,然后对其进行HTML解析,但是,为什么不对网站API发出直接请求:< / p>

import requests

result = requests.get("https://www.holonis.com/api/v2/activities/motivationquotes/all?limit=15&page=0")
data = result.json()

for post in data["items"]:
    print(post["body"]["description"])

仅为示例目的检索和打印帖子描述 - post词典包含网页上显示的所有其他相关帖子数据。

答案 2 :(得分:0)

BeautifulSoup没有任何问题,实际上,GET请求的结果不包含任何ng-scope文字。

您可以在此处查看输出:

>>> from bs4 import BeautifulSoup
>>> import requests
>>> 
>>> result = requests.get("https://www.holonis.com/motivationquotes")
>>> c = result.content
>>> 
>>> print(c)
**Verify the output yourself**

答案 3 :(得分:0)

您可以从正则表达式结果中看到ng-cloak类:

import re
regex = re.compile('ng.*')

samples = soup.findAll("div", {"class": regex})
samples
#[<div class="ng-cloak slideRoute" data-ui-view="main" fixed="400" main-content="" ng-class="'{{$state.$current.animateClass}}'"></div>]

答案 4 :(得分:0)

要获取该网页的内容,使用其api或选择X<String> x = .... 之类的任何浏览器模拟器都是明智之举。该网页使用lazyload加载它的内容。向下滚动时,您会看到更多内容。该网页通过selenium之类的分页扩展其内容。但是,你可以试一试。我创建了这个脚本来解析4页内显示的内容。您可以随时更改该页码以满足您的要求。

https://www.holonis.com/excellenceaddiction/1

顺便说一句,上面的脚本解析了每个帖子的from selenium import webdriver URL = "https://www.holonis.com/excellenceaddiction/{}" driver = webdriver.Chrome() #If necessary, define the path for link in [URL.format(page) for page in range(1,4)]: driver.get(link) for items in driver.find_elements_by_css_selector('.tile-content .tile-content-text'): print(items.text) driver.quit()