我一直试图从here刮掉 table ,但在我看来,BeautifulSoup找不到任何 table .
我写:
import requests
import pandas as pd
from bs4 import BeautifulSoup
import csv
url = "http://www.payscale.com/college-salary-report/bachelors?page=65"
r=requests.get(url)
data=r.text
soup=BeautifulSoup(data,'xml')
table=soup.find_all('table')
print table #prints nothing..
基于其他类似的问题,我假设HTML在某种程度上被打破了,但我找到了答案:(Beautiful soup missing some html table tags),(Extracting a table from a website),(Scraping a table using BeautifulSoup),甚至(Python+BeautifulSoup: scraping a particular table from a webpage)
谢谢你!
3 回答
您正在解析
html
,但您使用了xml
解析器 .你应该使用
soup=BeautifulSoup(data,"html.parser")
您的必要数据在
script
标记中,实际上实际上没有table
标记 . 所以,你需要在script
中找到文本 .N.B: If you are using Python 2.x then use "HTMLParser" instead of "html.parser".
这是代码 .
这将在csv中生成必要的表 . 完成后不要忘记关闭文件 .
虽然这不是
r.text
中的't find the table that',但是你要求BeautifulSoup
使用xml
解析器而不是html.parser
所以我建议将该行更改为:soup=BeautifulSoup(data,'html.parser')
您将通过网络抓取遇到的问题之一是所谓的"client-rendered"网站与服务器呈现 . 基本上,这意味着您通过
requests
模块或通过curl
从基本html请求获取的页面与在Web浏览器中呈现的内容不同 . 一些常见的框架是React和Angular . 如果你检查你想要抓取的页面的来源,他们在他们的几个html元素上有data-react-id
. Angular页面的常见说明是具有前缀ng
的类似元素属性,例如ng-if
或ng-bind
. 您可以通过各自的开发工具在Chrome或Firefox中查看该页面的来源,这些工具可以使用任一浏览器中的键盘快捷键Ctrl+Shift+I
启动 . 值得注意的是,并非所有React和Angular页面都只是客户端呈现的 .要获得此类内容,您需要使用无头浏览器工具,如Selenium . 使用Selenium和Python进行Web抓取有很多资源 .
数据位于JavaScript变量中,您应该找到js文本数据,然后使用正则表达式来提取它 . 当你得到数据时,它是包含900学校字典的json列表对象,你应该使用json模块将它加载到python list obejct .
出: