我试图看看这个页面上有多少类,但输出为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
答案 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()
。