【问题标题】:How to Extract the data from html如何从html中提取数据
【发布时间】:2020-09-30 13:45:34
【问题描述】:

我试图使用 beautifulsoup4 和 python 来抓取某个网站。但是,当我尝试查看 URL 中的内容时,它只给了我一个标题部分,并没有给我想要使用的正文部分。

URL = "url"
URL_page = requests.get(URL)
print(URL_page.text)

这给了我

<!DOCTYPE html>
<html>
 <head>
"Contents of Header"
 </head>
  <body>
   <div id='root'></div>
  </body>
</html>

body 标签内应该有内容,但它什么也不显示。 这个网页的原始html是这样的

<html xmlns:wb="http://open.weibo.com/wb" style> 
 ▶<head...</head>                     ← ONLY GIVES ME THIS
 ▶<body data-loaded="true">...</body> ← I NEED THIS PART
</html>

【问题讨论】:

    标签: python html google-chrome web-scraping beautifulsoup


    【解决方案1】:

    我想,你应该使用'user-agent'。你可以试试:

    from bs4 import BeautifulSoup
    import requests
    
    headers =  {'User-Agent': 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0 '}
    url = "https://www.pixiv.net/en/users/14792128"
    response = requests.get(url,headers=headers)
    soup = BeautifulSoup(response.text, 'lxml')
    print(soup.prettify())
    

    【讨论】:

      【解决方案2】:

      不知道你究竟想要什么作为输出。但是您可以从 ajax 访问 json 响应:

      import pandas as pd
      import requests
      
      url='https://www.pixiv.net/ajax/user/14792128/profile/all?lang=en'
      
      jsonData = requests.get(url).json()
      data = jsonData['body']['mangaSeries']
      
      df = pd.DataFrame(data)
      

      【讨论】:

        【解决方案3】:

        如果没有有效的 URL,很难提供有效的答案,但您的问题确实提供了一些线索。

        首先,你说你在 GET 的响应中收到了这个:

        <body>
        

        但是你在网络浏览器中看到了这个:

        <body data-loaded="true">
        

        这表明该页面运行的 JavaScript 代码在初始页面加载后继续加载和构建页面。

        没有办法使用requestsbs4 或类似的东西来解决这个问题。您可以检查具有实际内容的初始页面加载之后的请求(它可能是另一段 html、一些 json 等),并使用该请求来获取内容。如果您想尝试这样做,请尝试在良好的浏览器中打开开发人员工具,并在页面加载时查看网络选项卡,您会看到所有请求,其中一个可能包含您想要的内容。

        但是,如果您在渲染后需要 html,如脚本所渲染,您可以尝试使用 Python 中支持 JavaScript 的浏览器,例如通过 Selenium Chrome 网络驱动程序驱动的 Chrome:

        from selenium import webdriver
        
        driver = webdriver.Chrome()
        driver.get("https://your.url/here")
        elem = driver.find_element_by_tag_name('body')
        print(elem.text)
        

        请注意,您需要安装 Selenium 并且需要获取相应驱动程序的副本,例如 chromedriver.exe。将其添加到您的虚拟环境中:

        【讨论】:

          猜你喜欢
          • 2017-12-22
          • 2018-11-27
          • 1970-01-01
          • 2016-04-15
          • 2019-05-24
          • 1970-01-01
          • 2010-12-11
          • 1970-01-01
          • 2012-08-01
          相关资源
          最近更新 更多