【问题标题】:Beautiful Soup does not get full divBeautiful Soup 没有得到完整的 div
【发布时间】: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=0i = i + 1
  • 第9个div的结构和其他的完全一样吗?至少能贴出8号和9号的代码吗?
  • @Maaz 我已经提取了 2 个 div 的代码结构(并替换了文本):pastebin.com/N2bPYFBD 据我所知,它与另一个具有完全相同的结构。跨度>

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


【解决方案1】:

似乎html.parser 搞乱了 DOM。 lxml-parser 为我工作:

import requests
from bs4 import BeautifulSoup

url = "six-pack-thingy"
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
cards = soup.find_all("div", {"class": "card-body"})
texte = [card.text for card in cards[3:]]

【讨论】:

  • 我昨天试过了......我可以发誓,它没有用......为什么它现在有效,我要疯了吗?非常感谢!
【解决方案2】:

我想我也可以发布我的涂鸦:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('six-pack-thingy')
elems = driver.find_elements_by_class_name('card-body')

texte = [t.text for t in elems[3:]]

不过,您必须获得一些 webdriver 才能运行 selenium。你熟悉吗?

【讨论】:

  • 谢谢,这可以作为替代方案。当然,这会使事情变慢很多,所以我会尝试找到另一种解决方案。如果我失败了,我会回到这个,谢谢。
猜你喜欢
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2020-12-01
  • 2019-07-21
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多