<p>您试图抓取的网站上的新闻数据是使用JavaScript(称为<a href="https://en.wikipedia.org/wiki/XMLHttpRequest" rel="nofollow noreferrer">XHR -- XMLHttpRequest</a>)从服务器获取的。它是在加载或滚动页面时动态发生的。因此,这些数据不会在服务器返回的页面中返回</p>
<p>在第一个示例中,您只获得服务器返回的页面——没有新闻,但是使用JS应该获得新闻。请求和BeautifulSoup都不能执行JS</p>
<p>但是,您可以尝试使用Python请求复制从服务器获取新闻标题的请求。执行以下步骤:</p>
<ol>
<li>打开浏览器的DevTools(通常您必须按F12或Ctrl+Shift的组合键),然后查看从服务器获取新闻标题的请求。有时,它甚至比用BeautifulSoup刮网更容易。以下是一个屏幕截图(Firefox):
<a href="https://i.stack.imgur.com/2T2I9.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/2T2I9.png" alt="Screenshot (Firefox)"/></a></li>
</ol>
<ol start=“2”>
<li><p>复制请求链接(右键单击->;复制->;复制链接),并将其传递给<code>requests.get(...)</code></p>
</li>
<li><p>获取请求的<code>.json()</code>。它将返回一个易于使用的dict。为了更好地理解dict的结构,我建议使用<code>pprint</code>而不是简单的打印。请注意,在使用它之前必须执行<code>from pprint import pprint</code></p>
</li>
</ol>
<p>下面是从页面上的主要新闻中获取标题的代码示例:</p>
<pre><code>import requests
nodes = requests.get("https://www.todayonline.com/api/v3/news_feed/7")\
.json()["nodes"]
for node in nodes:
print(node["node"]["title"])
</code></pre>
<p>如果您想在标题下抓取一组新闻,您需要更改请求URL中<code>news_feed/</code>后的数字(要获得它,您只需要在DevTools中通过“news_feed”过滤请求并向下滚动新闻页面)</p>
<p>有时网站有防机器人程序的保护(尽管你试图抓取的网站没有)。在这种情况下,您可能还需要执行<a href="https://stackoverflow.com/a/60356159/8661764">these steps</a></p>