【发布时间】:2019-12-10 13:51:47
【问题描述】:
BeautifulSoup 做了一些奇怪的事情,我不知道为什么。
import requests
from bs4 import BeautifulSoup
url = "nsfw"
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
cards = soup.find_all("div", {"class": "card-body"})
cards.pop(0)
cards.pop(0)
cards.pop(0) # i really like to pop
texte = []
print(soup)
for i, card in enumerate(cards):
texte.append(card.text)
if i == len(cards)-1:
print(card)
现在我期望它做的是获取 div 并将 div 的文本放入数组中。它确实有效。对于 9 个 div 中的前 8 个。第 9 个 div 被极度缩短。打印结果:
<div class="card-body" id="card_Part_9"><p class="storytext"><span class="brk2_firstwords">“Door’s open,” Brendan shouted.</span></p>
<p class="storytext">Jeffrey</p></div>
但在网站本身上,它并没有就此结束。这是截图:https://i.imgur.com/CmvYzfJ.png
为什么会这样?我能做些什么来防止这种情况发生?我已经尝试更改解析器,但这不会改变结果。该网站不使用 Javascript 加载内容。
使用浏览器打开时的结构:https://pastebin.com/N2bPYFBD
但是当我打印(汤)时,我得到:
<p class="storytext">Jeffrey</p></div></div></div></div></div></div></div></body></html> entered the apartment```
【问题讨论】:
-
我猜标题下面的段落是在下一个带有
class="storytext"的p标签中 -
@OD1995 整个 div 只包含很多 p 标签。但是前8个没问题?
-
这很奇怪。如果没有 URL,很难提供更多帮助,但也许您必须以不同的方式处理最终的 div 才能使您的代码正常工作?另外,提示一下,您可以使用
for i, card in enumerate(cards):而不必使用i=0和i = i + 1 -
第9个div的结构和其他的完全一样吗?至少能贴出8号和9号的代码吗?
-
@Maaz 我已经提取了 2 个 div 的代码结构(并替换了文本):pastebin.com/N2bPYFBD 据我所知,它与另一个具有完全相同的结构。跨度>
标签: python python-3.x beautifulsoup python-requests