【问题标题】:Cannot pull data from pantip.com无法从 pantip.com 提取数据
【发布时间】:2019-01-02 10:10:01
【问题描述】:

我一直在尝试从 pantip.com 提取数据,包括标题、帖子和所有使用 beautifulsoup 的 cmets。 但是,我只能提取标题和帖子。我无法获得 cmets。 这是标题和帖子的代码

import requests
import re
from bs4 import BeautifulSoup


# specify the url
url = 'https://pantip.com/topic/38372443'

# Split Topic number
topic_number = re.split('https://pantip.com/topic/', url)
topic_number = topic_number[1]


page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

# Capture title
elementTag_title = soup.find(id = 'topic-'+ topic_number)
title = str(elementTag_title.find_all(class_ = 'display-post-title')[0].string)

# Capture post story
resultSet_post = elementTag_title.find_all(class_ = 'display-post-story')[0]
post = resultSet_post.contents[1].text.strip()

我试图通过 id 查找

elementTag_comment = soup.find(id = "comments-jsrender")

根据

我得到了下面的结果。

elementTag_comment =

<div id="comments-jsrender">
<div class="loadmore-bar loadmore-bar-paging"> <a href="javascript:void(0)"> 
<span class="icon-expand-left"><small>▼</small></span> <span class="focus- 
txt"><span class="loading-txt">กำลังโหลดข้อมูล...</span></span> <span 
class="icon-expand-right"><small>▼</small></span> </a> </div>
</div>

问题是我怎样才能得到所有的 cmets。请建议我如何解决它。

【问题讨论】:

  • 乍一看,帖子似乎存在延迟加载。 (评论在页面后异步加载)。如果您查看网络选项卡,您可以看到“render_cmets”资源网络调用...请参考这个答案:stackoverflow.com/a/47851306/6283258
  • soup.find() 只会返回找到的第一个元素。如果你想要所有 id = "cmets-jsrender" 的标签,你需要使用soup.find_all()。然后根据您想要做什么,可能需要遍历每个元素。

标签: python selenium web-scraping beautifulsoup nlp


【解决方案1】:

您无法找到其余这些帖子的原因是该网站填充了动态 javascript。为了解决这个问题,您可以使用 selenium 实现解决方案,请参阅此处如何获取正确的驱动程序并添加到您的系统变量 https://github.com/mozilla/geckodriver/releases 。 Selenium 将加载该页面,您将可以完全访问您在屏幕截图中看到的所有属性,并且只使用未解析数据的漂亮汤。

完成此操作后,您可以使用以下内容返回每个帖子数据:

from bs4 import BeautifulSoup
from selenium import webdriver

url='https://pantip.com/topic/38372443'
driver = webdriver.Firefox()
driver.get(url)
content=driver.page_source
soup=BeautifulSoup(content,'lxml')

for div in soup.find_all("div", id=lambda value: value and value.startswith("comment-")):
    if len(str(div.text).strip()) > 1:
        print(str(div.text).strip())

driver.quit()

【讨论】:

  • 非常感谢。我想知道我是否可以在不弹出 Web 浏览器的情况下做到这一点。我认为这可能有助于提高速度。
猜你喜欢
  • 1970-01-01
  • 2013-04-06
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2021-05-12
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多